Bir komutun sonucuna bir docker ENV değişkeni ayarlamak mümkün müdür? Sevmek:
ENV MY_VAR whoami
MY_VAR'ın "root" değerini veya whoami'nin döndürdüğü değeri almasını istiyorum
Yanıtlar:
DarkSideF cevabına ek olarak.
Dockerfile'daki her satırın / komutun başka bir konteynerde çalıştırıldığını bilmelisiniz.
Bunun gibi bir şey yapabilirsiniz:
RUN export bleah=$(hostname -f);echo $bleah;
Bu, tek bir kapta çalıştırılır.
$bleah
olduğu değil hatta aynı dockerfile sonraki satırda bu RUN komutu dışında kullanılabilir her yerde, kapalı dayanıyor başka görüntüde dursun. Docker'daki gerçekten bariz eksik özellik, bir dosyaya yazmak ve bir dosyadan okumak gibi görünüyor, (dinamik) değişkenleri görüntülerde depolamanın ve onları görüntüler arasında geçirmenin tek yolu, bu süper hile gibi görünüyor.
Aynı sorunu yaşadım ve dockerfile'da RUN komutunu kullanarak fonksiyonun sonucu olarak ortam değişkenini ayarlamanın bir yolunu buldum.
Örneğin, SECRET_KEY_BASE for Rails uygulamasını çalıştırdığımda olduğu gibi değiştirmeden yalnızca bir kez ayarlamam gerekiyor:
docker run -e SECRET_KEY_BASE="$(openssl rand -hex 64)"
Bunun yerine Dockerfile dizesine şöyle yazıyorum:
RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'
ve env değişkenim, bash oturum açtıktan sonra bile kökten kullanılabilir. ya da belki
RUN /bin/bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" > /etc/profile.d/docker_init.sh'
CMD ve ENTRYPOINT komutlarında değişken kullanılabilir
Docker, onu katman olarak önbelleğe alır ve yalnızca ondan önce bazı dizeleri değiştirirseniz değişir.
Ayrıca ortam değişkenini ayarlamak için farklı yollar deneyebilirsiniz .
*.sh
İçindeki herhangi bir dosya /etc/profile.d/
çevreyi doldurmak için kullanılır
Şu anda, bir komut sonucu ile kullanılabilir RUN export
, ancak bir ENV
değişkene atanamaz .
Bilinen sorun: https://github.com/docker/docker/issues/29110
Bu cevap @DarkSideF'e bir cevaptır ,
Önerdiği yöntem şudur Dockerfile
:
RUN bash -l -c 'echo export SECRET_KEY_BASE="$(openssl rand -hex 64)" >> /etc/bash.bashrc'
( içine bir dışa aktarma ekleme/etc/bash.bashrc
)
Bu iyidir, ancak ortam değişkeni yalnızca işlem için kullanılabilir olacaktır /bin/bash
ve docker uygulamanızı bir Node.js uygulaması gibi çalıştırmayı denerseniz,/etc/bash.bashrc
, tamamen yok sayılır ve uygulamanız SECRET_KEY_BASE
çalışırken ne olduğu konusunda tek bir ipucu almayacaktır. erişmek içinprocess.env.SECRET_KEY_BASE
.
ENV
Anahtar kelimenin herkesin dinamik bir komutla kullanmaya çalışmasının nedeni budur çünkü konteynerinizi her çalıştırdığınızda veya bir exec
komut kullandığınızda Docker kontrol edecektir.ENV
şu anda çalıştırılan işlemdeki her değeri ve yönlendirir (benzer -e
).
Çözümlerden biri, bir sarmalayıcı kullanmaktır ( bu github konusunda @duglin'e atıfta bulunun ). Proje kökünüzde aşağıdakileri içeren bir sarmalayıcı dosyası (örneğin ) bulundurun:envwrapper
#!/bin/bash
export SECRET_KEY_BASE="$(openssl rand -hex 64)"
export ANOTHER_ENV "hello world"
$*
ve sonra sizin Dockerfile
:
...
COPY . .
RUN mv envwrapper /bin/.
RUN chmod 755 /bin/envwrapper
CMD envwrapper myapp
@ DarkSideF'in cevabına ek olarak Dockerfile
, oluşturma sürecinde önceki bir komutun sonucunu yeniden kullanmak istiyorsanız , aşağıdaki geçici çözümü kullanabilirsiniz:
Örneğin :
RUN echo "bla" > ./result
RUN echo $(cat ./result)
Daha temiz bir şey için, adında küçük bir CLI sağlayan aşağıdaki özü de kullanabilirsiniz envstore.py
:
RUN envstore.py set MY_VAR bla
RUN echo $(envstore.py get MY_VAR)
Veya benzer bir CLI'ye sahip python-dotenv kitaplığını kullanabilirsiniz .
Aradığınız şeyin bu olup olmadığından emin değilsiniz, ancak .Dockerfile derlemenize ENV değişkenlerini veya ARGS'yi enjekte etmek için bu kalıp çalışır.
my_build.sh dosyanızda:
echo getting version of osbase image to build from
OSBASE=$(grep "osbase_version" .version | sed 's/^.*: //')
echo building docker
docker build -f \
--build-arg ARTIFACT_TAG=$OSBASE \
PATH_TO_MY.Dockerfile \
-t my_artifact_home_url/bucketname:$TAG .
.Dockerfile dosyanıza bir ARG almak için pasaj şu şekilde görünebilir:
FROM scratch
ARG ARTIFACT_TAG
FROM my_artifact_home_url/bucketname:${ARTIFACT_TAG}
alternatif olarak .Dockerfile dosyanıza bir ENV almak için pasaj şu şekilde görünebilir:
FROM someimage:latest
ARG ARTIFACT_TAG
ENV ARTIFACT_TAG=${ARTIFACT_TAG}
fikir, kabuk komut dosyasını çalıştırmanızdır ve bu, derlemede seçenekler olarak iletilen değiştirgeler ile.