Wie verwende ich die Docker-Umgebungsvariable im ENTRYPOINT-Array?

109

Wenn ich beispielsweise eine Umgebungsvariable festlege ENV ADDRESSEE=worldund sie in dem Einstiegspunktskript verwenden möchte, das zu einer festen Zeichenfolge verkettet ist, wie:

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

mit worlddem Wert der Umwelt varible ist, wie kann ich es tun? Ich habe es versucht, "Hello, $ADDRESSEE"aber das scheint nicht zu funktionieren, da es $ADDRESSEEwörtlich genommen wird.

Psycho Punch
quelle

Antworten:

216

Sie verwenden die Exec-Form von ENTRYPOINT. Im Gegensatz zum Shell-Formular ruft das Exec-Formular keine Befehlsshell auf. Dies bedeutet, dass keine normale Shell-Verarbeitung stattfindet. Beispielsweise ENTRYPOINT [ "echo", "$HOME" ]wird $ HOME nicht durch Variablen ersetzt. Wenn Sie eine Shell-Verarbeitung wünschen, verwenden Sie entweder das Shell-Formular oder führen Sie eine Shell direkt aus, zum Beispiel : ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Wenn Sie das Exec-Formular verwenden und eine Shell direkt ausführen, wie im Fall des Shell-Formulars, führt die Shell die Erweiterung der Umgebungsvariablen durch, nicht das Docker (aus der Dockerfile-Referenz ).

In Ihrem Fall würde ich Shell-Form verwenden

ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\!"
vitr
quelle
2
ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$portwährend ENV port=123. Der Port ENV wird nicht aufgelöst. Irgendwelche Ideen warum?
Xetra11
1
Während es funktioniert, scheint es einige neue Probleme zu verursachen, wie das Nichteinschließen der übergebenen Argumente an diesen Einstiegspunkt. Zum Beispiel können Sie --attitude "shouting"dem docker runBefehl kein Argument hinzufügen , das an./greeting
Daniel F
5
Verwenden ENTRYPOINT ./greeting --message "Hello, $ADDRESSEE\! $0 $@"Sie diese Option, wenn Sie zusätzliche Variablen ./greetingüber den docker runAufruf übergeben möchten (oder CMDdie Docker-Datei übergeben möchten)
Daniel F
3
Beachten Sie, dass die Shell-Form dazu führen kann, dass Signale nicht an den Prozess weitergeleitet werden ( greetingin Ihrem Beispiel). hynek.me/articles/docker-signals
jbg
Kann ich den Wert einer Umgebungsvariablen in Exec-Form wie `[myexecutable.sh," $ variable "] abrufen, kann ich dies mit [" sh "," -c "," echo $ var "] tun, aber nicht auf diese Weise
Lazarus
13

Ich habe versucht, mit der vorgeschlagenen Antwort zu lösen und bin trotzdem auf einige Probleme gestoßen ...

Dies war eine Lösung für mein Problem:

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

Speziell auf Ihr Problem ausgerichtet:

RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]
Ben Kauffman
quelle
Es scheint, dass Ihre Antwort keine vollständige Lösung für die Frage des OP
bietet
Ich glaube, ich verstehe nicht, wie es keine Lösung für die Frage des OP bietet ... Ich habe ein Beispiel aktualisiert, um es unter Berücksichtigung der genauen Frage zu lösen.
Ben Kauffman
Du hast immer noch erwähnt, dass du auf einige Probleme gestoßen bist !!
user9405863
Richtig, deshalb habe ich eine neue Lösung eingeführt. ... die "akzeptierte" Antwort hat bei mir nicht funktioniert, also habe ich ein Shell-Skript aufgerufen und das hat funktioniert.
Ben Kauffman
2
Ich würde gerne Ihren Ansatz dann @ReverendTim hören;)
Ben Kauffman
6

Nach viel Schmerz und großer Unterstützung von @vitr et al. Entschied ich mich, es zu versuchen

  • Standard-Bash-Substitution
  • Schalenform von ENTRYPOINT (toller Tipp von oben)

und das hat funktioniert.

ENV LISTEN_PORT=""

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

z.B

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

und

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

Beide haben den Port in meinem Container richtig eingestellt

Refs

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

mlo55
quelle