Dockerfile'da ortam değişkeni değerini alma


254

Yakut bir uygulama için bir konteyner inşa ediyorum. Uygulamamın yapılandırması, ortam değişkenleri içinde (uygulamanın içine dotenv yüklü) yüklenmiştir .

Bu yapılandırma değişkenlerinden biri, bağlantı yapmak için dahili olarak kullanılan uygulamanın genel ipidir. Konteyner içinde 127.0.0.1 için bu ip işaret eden bir dnsmasq giriş eklemeniz gerekir, böylece kapsayıcı değil gibi uygulamanın bağlantılarını getirebilirsiniz.

Bu nedenle bir ENVDockerfile bir ortam değişkeni kapsayıcı geçmesini ayarlamaya çalışıyorum .

Birkaç şey denedim.

ENV REQUEST_DOMAIN $REQUEST_DOMAIN
ENV REQUEST_DOMAIN `REQUEST_DOMAIN`

Her şey yine de ortam değişkeninin değeri yerine "REQUEST_DOMAIN" dizesini geçer. Ortam değişkeni değerlerini ana makineden kaba aktarmanın bir yolu var mı?

Yanıtlar:


392

Dockerfile dosyasında bu amaç için tasarlanmış ARGyönergeyi kullanmalısınız .

ARGTalimat kullanıcıları kullanarak liman işçisi inşa komutuyla oluşturucu derleme sırasında geçirebilmesi bir değişken tanımlar --build-arg <varname>=<value>bayrak.

Böylece Dockerfile dosyasında şu satır bulunur:

ARG request_domain

veya varsayılan bir değer tercih ediyorsanız:

ARG request_domain=127.0.0.1

Artık Dockerfile dosyanızdaki bu değişkene başvurabilirsiniz:

ENV request_domain=$request_domain

o zaman kabınızı şöyle inşa edeceksiniz:

$ docker build --build-arg request_domain=mydomain Dockerfile


Not 1:ARG Dockerfile dosyanızda bir referansa başvurduysanız ancak hariç tuttuysanız resminiz oluşturulmaz --build-arg.

Not 2: Bir kullanıcı Dockerfile dosyasında tanımlı olmayan bir yapı bağımsız değişkeni belirtirse, yapı bir uyarı verir:

[Uyarı] Bir veya daha fazla derleme argümanı [foo] tüketilmedi.


12
ARG, docker v1.9'dan itibaren kullanılabilir.
Synesso

bu docker repo üzerinde uzaktan inşa edilmesi destekleniyor mu?
James Lin

4
Your image will not build if you have referenced an ARG in your Dockerfile but excluded it in --build-argHatalısınız. --Build-arg olmadan bile referanslarla görüntü oluşturabilirsiniz. Ayrıca build arg için varsayılan değer ayarlayabilirsiniz.
ALex_hha

1
ENV hattının amacı nedir? Benim için --build-arg + ARG yeterliydi.
Phil

3
ARG, sonraki komutlarda dockerfile içinde kullanılacak bir değişkeni tanımlar. ENV, kaba aktarılan bir ortam değişkenini tanımlar.
herm

56

Böylece şunları yapabilirsiniz: cat Dockerfile | envsubst | docker build -t my-target -

Sonra aşağıdaki gibi bir Dockerfile var:

ENV MY_ENV_VAR $MY_ENV_VAR

Sanırım bazı özel karakterlerle ilgili bir sorun olabilir, ancak bu en azından çoğu durumda işe yarar.


13
Dockerfile dosyasını içeren dizindeki dosyaları EKLEMEK gerekiyorsa bu işe yaramaz.
Tom Hennen

2
Çok güzel bir çözüm! Mac'te envsubstbunun bir parçası olabilirsiniz brew install gettext. Ancak BSD derleme sistemi ile olası çatışmalar nedeniyle "sadece fıçı" ve hiçbir symlnks yapılmaz. Ancak, ln -s /usr/local/Cellar/gettext/*/bin/envsubst /usr/local/bin/bir komutu PATH'nize eklemek güvenlidir . (Bu gerçekten endişe verici olan kütüphanelerdir.) Ya da /usr/local/Cellar/gettext/*/bin/envsubstyerinde kullanabilirsiniz
Bruno Bronosky

1
@ TomHennen'ın açıklamasını açıklığa kavuşturmak için Dockerfile'ı borulamak docker build -, özellikle, env var ikamesinden bağımsız olarak Dockerfile'nızdan göreli yollara başvurduğunuzda çalışmayan şeydir.
superEb

4
Eğer TomHennen yorumuna @ Re, do sizin Dockerfile içinde KOPYASINI gibi bağlam-bağımlı komutları kullanmak istiyorum her zaman geçici bir dosyaya envsubst çıktısını yönlendirmek ve daha sonra içine yem olabilir docker buildyerine. Örnek:, cat Dockerfile | envsubst > DockerfileWithEnvVarssonra docker build -t my-target -f DockerfileWithEnvVars ., sonrarm DockerfileWithEnvVars
15:05

Veya moreutils paketinden sünger kullanabilirsinizenvsubst < Dockerfile | sponge Dockerfile
ALex_hha

19

Veya envsubstgibi komutları kullanma yeteneğini kaybetmeden ve ara dosyaları kullanmadan kullanan bir alternatif , Bash'in İşlem Değiştirme'yi kullanmak olacaktır :COPYADD

docker build -f <(envsubst < Dockerfile) -t my-target .

3
ne yazık ki bu çalışmıyor gibi görünüyor (Docker 17.09), hatayı alıyorumunable to prepare context: the Dockerfile (/dev/fd/63) must be within the build context
Alexander Klimetschek

11

Çalışma zamanında oluşturduğunuz bir dosyadan ortam değişkenleri yükleyin.

export MYVAR="my_var_outside"
cat > build/env.sh <<EOF
MYVAR=${MYVAR}
EOF

... sonra Dockerfile'da

ADD build /build
RUN /build/test.sh

Burada test.sh, MYVAR'ı env.sh'tan yükler

#!/bin/bash
. /build/env.sh
echo $MYVAR > /tmp/testfile

4

Bir Dockerfile içindeki tüm ortam değişkenlerini ($ SampleEnvVar) bulmak ve değiştirmek istiyorsanız, derleyin, bu işe yarayacaktır:

envsubst < /path/to/Dockerfile | docker build -t myDockerImage . -f -


Burada en iyi cevap, ve buna dayanarak envsubst < ./Dockerfile | docker build -squash -t ${DOCKIMG}:${VERSION} . -f -, FROMhattın ortam değişkenini nerede kullandığı.
mikequentel

-6

-eortam değişkenlerini kaba aktarmak için anahtar ekleyin . misal:

$ MYSQLHOSTIP=$(sudo docker inspect -format="{{ .NetworkSettings.IPAddress }}" $MYSQL_CONRAINER_ID)
$ sudo docker run -e DBIP=$MYSQLHOSTIP -i -t myimage /bin/bash

root@87f235949a13:/# echo $DBIP
172.17.0.2

6
Damien bir görüntü oluşturmak istiyor. -e bunun yerine run komutuyla çalışır.
Andres Restrepo
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.