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
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.
versi: '3'
jasa:
web1:
gambar: softwaremaker / web-w
lingkungan Hidup:
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
DARI nginx: nginx AS terbaru
JALANKAN mkdir / env && env> /env/.env_nginx
DARI php: fpm-buster SEBAGAI 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.
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
Dockerfile