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.