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.