Come si utilizza la variabile di ambiente Docker nell'array ENTRYPOINT?


109

Se imposto una variabile d'ambiente, diciamo ENV ADDRESSEE=world, e voglio usarla nello script del punto di ingresso concatenato in una stringa fissa come:

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

con worldessendo il valore della varible dell'ambiente, come posso fare? Ho provato a usare "Hello, $ADDRESSEE"ma non sembra funzionare, poiché prende $ADDRESSEEletteralmente.

Risposte:


216

Stai usando la forma esecutiva di ENTRYPOINT. A differenza del form della shell , il form exec non richiama una shell dei comandi. Ciò significa che la normale elaborazione della shell non avviene. Ad esempio, ENTRYPOINT [ "echo", "$HOME" ]non effettuerà la sostituzione delle variabili su $ HOME. Se si desidera che l'elaborazione di shell quindi utilizzare il modulo di shell o eseguire una shell direttamente, per esempio: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Quando si utilizza il form exec e si esegue direttamente una shell, come nel caso del form di shell, è la shell che esegue l'espansione della variabile d'ambiente, non docker. ( Dal riferimento Dockerfile )

Nel tuo caso, userei la forma della shell

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

2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portmentre ENV port=123. La porta ENV non è stata risolta. Qualche idea sul perché?
xetra11

1
Mentre funziona, sembra creare alcuni nuovi problemi, come non includere gli argomenti passati a quel punto di ingresso. Ad esempio, non puoi aggiungere un --attitude "shouting"argomento al docker runcomando che dovrebbe essere passato a./greeting
Daniel F

5
Utilizzare ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"se si desidera passare anche variabili aggiuntive ./greetingtramite l' docker runinvocazione (o per passare CMDil Dockerfile)
Daniel F

3
Nota che la forma della shell può causare il mancato passaggio dei segnali al processo ( greetingnel tuo esempio). hynek.me/articles/docker-signals
jbg

posso ottenere il valore di una variabile d'ambiente in forma exec, come `[myexecutable.sh," $ variabile "], posso farlo con [" sh "," -c "," echo $ var "], ma non in questo modo
Lazzaro

13

Ho provato a risolvere con la risposta suggerita e ho riscontrato ancora alcuni problemi ...

Questa era una soluzione al mio problema:

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"]

Targeting specifico del tuo problema:

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

sembra che la tua risposta non fornisca soluzioni complete alla domanda
dell'OP

Suppongo di non capire come non fornisca una soluzione alla domanda dell'OP ... Ho aggiornato con un esempio per risolvere con la domanda esatta in mente.
Ben Kauffman

hai citato ancora ti sei imbattuto in alcuni problemi !!
user9405863

corretto, motivo per cui ho introdotto una nuova soluzione. ... la risposta "accettata" non ha funzionato per me, quindi faccio eco a uno script di shell e ha funzionato.
Ben Kauffman

2
Sarei interessato a sentire il tuo approccio quindi @ReverendTim;)
Ben Kauffman,

6

Dopo tanto dolore e grande assistenza da @vitr et al sopra, ho deciso di provare

  • sostituzione bash standard
  • forma shell di ENTRYPOINT (ottimo consiglio dall'alto)

e ha funzionato.

ENV LISTEN_PORT=""

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

per esempio

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

e

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

entrambi impostano correttamente la porta nel mio contenitore

refs

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

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.