Saya sedang membangun wadah untuk aplikasi ruby. Konfigurasi aplikasi saya terkandung dalam variabel lingkungan (dimuat di dalam aplikasi dengan dotenv ).
Salah satu variabel konfigurasi tersebut adalah ip publik aplikasi, yang digunakan secara internal untuk membuat tautan. Saya perlu menambahkan entri dnsmasq yang menunjuk ip ini ke 127.0.0.1 di dalam wadah, sehingga ia dapat mengambil tautan aplikasi seolah-olah itu tidak di kemas.
Karena itu saya mencoba untuk mengatur ENV
di Dockerfile saya yang akan mengirimkan variabel lingkungan ke wadah.
Saya mencoba beberapa hal.
ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`
Semuanya melewati string "REQUEST_DOMAIN" alih-alih nilai variabel lingkungan. Apakah ada cara untuk meneruskan nilai variabel lingkungan dari mesin host ke wadah?
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-arg
Anda salah. Anda dapat membangun gambar dengan referensi bahkan tanpa --build-arg. Selain itu Anda dapat menetapkan nilai default untuk build arg.Jadi kamu bisa melakukan:
cat Dockerfile | envsubst | docker build -t my-target -
Kemudian miliki Dockerfile dengan sesuatu seperti:
Saya kira mungkin ada masalah dengan beberapa karakter khusus, tetapi setidaknya ini berfungsi untuk sebagian besar kasus.
sumber
envsubst
sebagai bagian daribrew install gettext
. Tetapi karena kemungkinan konflik dengan sistem pembangunan BSD itu adalah "keg-only" dan tidak ada symlnks yang dibuat. Namun, amanln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/
untuk menambahkan satu perintah itu ke PATH Anda. (Ini benar-benar libs yang perhatian.) Atau Anda dapat menggunakannya dalam nya/usr/local/Cellar/gettext/*/bin/envsubst
lokasidocker build -
, khususnya, tidak berfungsi ketika Anda mereferensikan jalur relatif dari Dockerfile Anda, terlepas dari substitusi env var.docker build
gantinya. Contohcat Dockerfile | envsubst > DockerfileWithEnvVars
docker build -t my-target -f DockerfileWithEnvVars .
rm DockerfileWithEnvVars
envsubst < Dockerfile | sponge Dockerfile
Alternatif menggunakan
envsubst
tanpa kehilangan kemampuan untuk menggunakan perintah sepertiCOPY
atauADD
, dan tanpa menggunakan file perantara adalah dengan menggunakan Substitusi Proses Bash :sumber
unable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Memuat variabel lingkungan dari file yang Anda buat saat runtime.
... lalu di Dockerfile
di mana test.sh memuat MYVAR dari env.sh
sumber
Jika Anda hanya ingin menemukan dan mengganti semua variabel lingkungan ($ ExampleEnvVar) di Dockerfile kemudian membangunnya, ini akan berhasil:
envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -
sumber
envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -
manaFROM
garis menggunakan variabel lingkungan.tambahkan
-e
kunci untuk meneruskan variabel lingkungan ke wadah. contoh:sumber