Compose: Variabel lingkungan tidak diterapkan pada build penampung

Dibuat pada 10 Agu 2015  ·  16Komentar  ·  Sumber: docker/compose

Saat membuat container, variabel lingkungan tidak diterapkan.

docker-compose.yml:

img:
    build: img
    environment:
        VAR: Hello

/ img / Dockerfile:

FROM python:2.7
RUN python -c 'import os; print os.environ["VAR"]'

Diharapkan memiliki "Halo" tertulis, menerima KeyError: VAR - variabel lingkungan tidak ada.

Jika Anda masuk ke penampung dengan docker-compose run --rm img bash (setelah menghapus baris terakhir yang gagal) dan melakukan python -c 'import os; print os.environ["VAR"]' Anda akan mendapatkan hasil yang diharapkan.

docker-compose==1.3.3

docker-version :

Client version: 1.7.1
Client API version: 1.19
Go version (client): go1.4.2
Git commit (client): 786b29d
OS/Arch (client): linux/amd64
Server version: 1.7.1
Server API version: 1.19
Go version (server): go1.4.2
Git commit (server): 786b29d
OS/Arch (server): linux/amd64
kinquestion

Komentar yang paling membantu

jawaban atas pertanyaan stack overflow ini membantu https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

dimungkinkan untuk memetakan variabel lingkungan .env ke ARGS untuk digunakan oleh Dockerfile selama build.

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

Semua 16 komentar

Ini diharapkan. Kunci environment: dalam docker-compose.yml sama dengan menetapkannya ke perintah docker run untuk memulai penampung. build dan dockerfile adalah kunci lama yang digunakan untuk membuat gambar.

Ini mungkin tidak jelas dari dokumentasi dan dapat ditingkatkan.

Docker tidak mendukung lingkungan yang diinjeksi ke dalam lingkungan build (itu harus menjadi bagian dari Dockerfile), tetapi saya yakin ada beberapa proposal terbuka untuk menambahkan dukungan untuk sesuatu seperti itu.

Hanya referensi bagi siapa saja yang menemukan masalah ini, berikut adalah diskusi buruh pelabuhan mengenai variabel waktu pembuatan: https://github.com/docker/docker/issues/14634 dan PR terkait: https://github.com/docker/docker / pull / 15182

Ini membuat kami sulit, sangat membutuhkan dokumen yang lebih baik.

Dokumentasinya benar-benar membingungkan, misalnya berbicara tentang env-file, yang digunakan untuk docker-compose.yml dan digunakan untuk docker run . Mengingat bahwa docker-compose adalah alat orkestrasi untuk membangun dan menjalankan container, mudah untuk mengasumsikan bahwa lingkungan akan berlaku untuk waktu build, menggunakan --env <key>=<value> atau sesuatu seperti ini.

Gigit aku juga.
Sekadar meninggalkan catatan bahwa variabel lingkungan dapat disetel sebagai build args di file compose. Seperti orang lain di utas ini, saya awalnya mengharapkan env_file atau lingkungan untuk digunakan oleh build dan run.
Diverifikasi dengan compose file v2, docker-compose v1.7, docker-engine v1.11.

Dokumen yang diperbarui di https://github.com/docker/compose/pull/3747

Perhatikan bahwa jika Anda perlu menyertakan env vars dari file, Anda dapat melakukan hal berikut. Ini akan membutuhkan argumen (di bagian build-docker-compose) yang disetel dari variabel-variabel ini, yang kemudian dapat Anda rujuk di file buruh pelabuhan Anda. Artinya, meskipun Anda tidak dapat menggunakan kembali env_file secara langsung, Anda dapat melakukannya dengan sedikit usaha ekstra.

env $(cat vars.env | xargs) docker-compose up --build <whatever>

jawaban atas pertanyaan stack overflow ini membantu https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

dimungkinkan untuk memetakan variabel lingkungan .env ke ARGS untuk digunakan oleh Dockerfile selama build.

docker-compose.yml

version: "2"
services:

  lumen:
    build:
      context: .
      dockerfile: ./Dockerfile
      args:
        - PORT=${PORT}
    volumes:
       ...

Dockerfile

FROM php:7.0-apache
ARG PORT

ENV PORT "$PORT"

EXPOSE ${PORT}
...

@williamli Dapatkah Anda menambahkan link ke pertanyaan Stack Overflow?

Maaf kawan - Saya tidak yakin saya mengerti bagaimana menyelesaikan ini - dan saya ingin menggunakan gambar yang sudah dibuat sebelumnya.

Misalnya, file tulis saya adalah:

versi: '3'

jasa:
web1:
gambar: softwaremaker / web-w
lingkungan Hidup:

  • wtmsdemo_customerapi01 = http: // api1 / api / values
    port:
  • "89:80"
    tergantung pada:
  • api1
    api:
    gambar: softwaremaker / api-w
    jaringan:
    default:
    luar:

nama: nat

Saya dulu berpikir bahwa gambar api (softwaremaker / api-w) akan dapat diselesaikan ke dalam variabel lingkungan yang telah saya atur di atas tetapi tidak berhasil.

@Prabowo
menambahkan tautan stackoverflow ke komentar asli saya.

https://stackoverflow.com/questions/19537645/get-environment-variable-value-in-dockerfile

Masalahnya masih relevan untuk file env selain file default .env .
Kode Fe Berikutnya tidak akan berfungsi:

  nginx:
    env_file:
      - .env
      - .env.local
    environment:
     - SERVER_NAME=${SERVER_NAME}
    build:
      context: ./nginx
      dockerfile: Dockerfile
      args:
        server_name: ${SERVER_NAME}

sementara SERVER_NAME ditentukan di file env kedua ( .env.local ).
Saya tidak melihat opsi untuk meneruskan env vars dari .env.local untuk membangun konteks ((

@ort
Saya juga dapat mengonfirmasi ini, jika saya memiliki variabel yang digunakan selama build, variabel tersebut hanya diteruskan ke proses build jika file tersebut bernama .env jika diberi nama .env.docker mereka tidak mendapatkan dijemput. Bahkan ketika env_file ditentukan untuk menggunakan file .env.docker .

Solusi saya untuk ini selama saya membangun menyalin file env bernama lain dan mengganti namanya menjadi .env

COPY .env.docker ${APP_HOME}/.env
WORKDIR $APP_HOME

Setelah ini, muncul untuk mengambil variabel lingkungan saat penampung berjalan

Sistem Operasi: macOS (10.14.6)
Versi Docker Desktop: 2.1.0.5 (40693)
Versi Mesin: 19.03.5.0
Tulis: 1.24.1

Hai kawan,

Sebuah pertanyaan singkat untuk kalian semua, apakah ini cara yang lebih baik untuk membangun image untuk dev? Sejauh ini berfungsi dengan baik. Namun, apakah ini praktik yang direkomendasikan? Semua gambar didasarkan pada buster.

``
DARI redis: buster as redis
JALANKAN mkdir / env && env> /env/.env_redis
JALANKAN kucing / etc / passwd
JALANKAN ls -lah / home
DARI ruby: slim-buster AS ruby
JALANKAN mkdir / env && env> /env/.env_ruby

DARI node: node AS lts-buster-slim
JALANKAN mkdir / env && env> /env/.env_node

membangun nginx

DARI nginx: nginx AS terbaru
JALANKAN mkdir / env && env> /env/.env_nginx

membangun php

DARI php: fpm-buster SEBAGAI php

DARI php: 7.3.14-fpm-buster AS php

JALANKAN mkdir / env && env> /env/.env_php
SALIN --dari = redis / /
SALIN --dari = ruby ​​/ /
COPY --from = node / /
SALIN --dari = nginx / /

TAMBAHKAN conf / include-site.conf /etc/nginx/conf.d/include-site.conf
TAMBAHKAN conf / supervisord.conf /etc/supervisord.conf

JALANKAN su root
PAPARKAN 80443
WORKDIR "/ var / www / html"

ENTRYPOINT ["/ bin / bash", "/start.sh"]

Masalah masih ada.
Kunci env_file di bagian build akan lebih jelas daripada meneruskan env vars melalui args ke build container.
Seperti ini:

#NOT_WORKING
build:
      context: ./client
      dockerfile: Dockerfile
      env_file: ${CURRENT_ENV_FILE}

Karena saya menggunakan skrip shell untuk membangun dan meningkatkan penulisan buruh pelabuhan.
Untuk produksi saya membutuhkan env_file yang berbeda dari pada dev / local.
Dan ada banyak file docker-compose.env.yml dengan banyak argumen jadi tidak nyaman seperti yang saya kira

Saya pikir perlu ada cara elegan untuk mengatasi ini. Saya sangat menyukai sintaks buruh pelabuhan dan menggunakan argumen daripada variabel lingkungan tidak masuk akal bagi saya. Saya tidak ingin seseorang mengubah file tulis buruh pelabuhan saya secara manual. Mengubah nilai dalam file .env tampak konsisten bagi saya.

Apakah halaman ini membantu?
0 / 5 - 0 peringkat