webentwicklung-frage-antwort-db.com.de

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

Wenn ich eine Umgebungsvariable setze, sage ich ENV ADDRESSEE=world Und möchte sie in dem Einstiegspunktskript verwenden, das zu einer festen Zeichenfolge verkettet ist:

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

wie mache ich das, wenn world der Wert der Umgebungsvariablen ist? Ich habe versucht, "Hello, $ADDRESSEE" Zu verwenden, aber das scheint nicht zu funktionieren, da es den $ADDRESSEE Wörtlich nimmt.

75
Psycho Punch

Sie verwenden das Exec-Formular von ENTRYPOINT. Im Gegensatz zur Shell-Form ruft die exec-Form keine Befehls-Shell auf . Dies bedeutet, dass keine normale Shell-Verarbeitung stattfindet. Beispielsweise, ENTRYPOINT [ "echo", "$HOME" ] ersetzt $ HOME nicht durch Variablen. 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, wird die Umgebungsvariablenerweiterung von der Shell ausgeführt, nicht vom Docker (from Dockerfile reference =)

In Ihrem Fall würde ich Shell-Formular verwenden

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

Ich habe versucht, mit der vorgeschlagenen Antwort eine Lösung zu finden, und bin dennoch 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"]

7
Ben Kauffman

Nach viel Schmerz und großartiger Hilfe von @vitr et al. Oben habe ich beschlossen, es zu versuchen

  • standard-Bash-Substitution
  • Muschelform von [~ # ~] Eintrittspunkt [~ # ~] (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 setzen den port richtig in meinen container

Refs

siehe https://www.cyberciti.biz/tips/bash-Shell-parameter-substitution-2.html

1
mlo55