ENTRYPOINT dizisinde Docker ortam değişkenini nasıl kullanırım?


109

Örneğin bir ortam değişkeni ayarlarsam ENV ADDRESSEE=worldve bunu aşağıdaki gibi sabit bir dizeye birleştirilmiş giriş noktası komut dosyasında kullanmak istiyorum:

ENTRYPOINT ["./greeting", "--message", "Hello, world!"]

ile worldçevre variblenin değeri olan, nasıl yapacağım? Kullanmayı denedim "Hello, $ADDRESSEE"ama $ADDRESSEEtam anlamıyla olduğu için işe yaramıyor gibi görünüyor .

Yanıtlar:


217

Kullandığınız exec formu EntryPoint arasında. Kabuk formundan farklı olarak , exec formu bir komut kabuğunu çağırmaz. Bu, normal kabuk işlemenin gerçekleşmediği anlamına gelir. Örneğin, ENTRYPOINT [ "echo", "$HOME" ]$ HOME üzerinde değişken ikamesi yapmayacaktır. Eğer kabuk işlemeyi istiyorsanız kullanabilirsiniz kabuk formu veya örneğin doğrudan bir kabuk yürütün: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Exec formunu kullanırken ve doğrudan bir kabuğu çalıştırırken, kabuk formunda olduğu gibi, docker değil, ortam değişkeni genişletmesini yapan kabuktur . ( Dockerfile referansından )

Senin durumunda kabuk formu kullanırım

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portsüre ENV port=123. ENV bağlantı noktası çözülmedi. Herhangi bir fikriniz neden?
xetra11

1
Çalışırken, o giriş noktasına aktarılan argümanları dahil etmemek gibi bazı yeni sorunlar yaratıyor gibi görünüyor. Örneğin --attitude "shouting", docker runiletilmesi gereken komuta bir argüman ekleyemezsiniz./greeting
Daniel F

5
Kullanım ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"ayrıca başka değişkenler de geçirmek istiyorsanız ./greetingaracılığıyla docker runçağırma (veya geçmek CMDDockerfile arasında)
Daniel F

3
Kabuk formunun sinyallerin sürece ( greetingsizin örneğinizde) geçmemesine neden olabileceğini unutmayın. hynek.me/articles/docker-signals
jbg

"[yürütülebilirim.sh," $ değişken "] gibi bir ortam değişkeninin değerini alabilir miyim, [" sh "," -c "," echo $ var "] ile yapabilirim, ancak alamaz bu şekilde
lazarus

13

Önerilen cevapla çözmeye çalıştım ve yine de bazı sorunlarla karşılaştım ...

Bu benim sorunumun çözümüydü:

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Build a shell script because the ENTRYPOINT command doesn't like using ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Run the generated shell script.
ENTRYPOINT ["./entrypoint.sh"]

Özellikle sorununuzu hedeflemek:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

Görünüşe göre cevabınız OP'nin sorusuna tam çözümler
sunmuyor

Sanırım OP'nin sorusuna nasıl bir çözüm sağlamadığını anlamıyorum ... Aklımdaki tam soruyu çözmek için bir örnekle güncelledim.
Ben Kauffman

Hala bazı sorunlarla karşılaştığından bahsetmiştin !!
user9405863

doğru, bu yüzden yeni bir çözüm getirdim. ... "kabul edildi" cevabı benim için işe yaramadı, bu yüzden bir kabuk betiğine eko yaptım ve işe yaradı.
Ben Kauffman

2
Yaklaşımınızı duymak isterim sonra @ReverendTim;)
Ben Kauffman

6

Çok fazla acıdan ve yukarıdaki @vitr ve diğerlerinden büyük yardım aldıktan sonra, denemeye karar verdim

  • standart bash ikamesi
  • Kabuk şekilde bir giriş noktası (yukarıdan büyük uç)

ve bu işe yaradı.

ENV LISTEN_PORT=""

ENTRYPOINT java -cp "app:app/lib/*" hello.Application --server.port=${LISTEN_PORT:-80}

Örneğin

docker run --rm -p 8080:8080 -d --env LISTEN_PORT=8080 my-image

ve

docker run --rm -p 8080:80 -d my-image

her ikisi de kapımdaki bağlantı noktasını doğru şekilde ayarladı

Referanslar

bkz. https://www.cyberciti.biz/tips/bash-shell-parameter-substitution-2.html

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.