Dockerfile - ENV'yi komutun sonucuna ayarlayın


Yanıtlar:


21

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.


15
Sadece netleştirmek için - $bleaholduğ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.
davnicwil

17

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 .


/Etc/profile.d/docker_init.sh hala bir şey mi? Bu cevap, Google ile bulabildiğim tek söz ve benim için çalışmıyor. Belki de 2016'da artık güncel olmayan bir Docker yürütme motorunun bir parçası mıydı?
SigmaX

1
@SigmaX Bu bir liman işçisi değil, daha çok bir Linux meselesi. *.shİçindeki herhangi bir dosya /etc/profile.d/çevreyi doldurmak için kullanılır
Madacol


7

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/bashve 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 .

ENVAnahtar kelimenin herkesin dinamik bir komutla kullanmaya çalışmasının nedeni budur çünkü konteynerinizi her çalıştırdığınızda veya bir execkomut 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

4

@ 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:

  1. bir komut çalıştırın, sonucu bir dosyaya kaydedin
  2. o dosyadan önceki sonucu başka bir komuta almak için komut ikamesini kullanın

Ö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 .


2

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.

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.