183 votes

Comment utiliser la variable d'environnement Docker dans le tableau ENTRYPOINT ?

Si je définis une variable d'environnement, disons ENV ADDRESSEE=monde, et que je veux l'utiliser dans le script du point d'entrée concaténé dans une chaîne fixe :

ENTRYPOINT ["./greeting", "--message", "Bonjour, monde!"]

avec monde étant la valeur de la variable d'environnement, comment puis-je le faire ? J'ai essayé d'utiliser "Bonjour, $ADDRESSEE" mais cela ne semble pas fonctionner, car il prend $ADDRESSEE littéralement.

319voto

vitr Points 3412

Vous utilisez le formulaire exec de l'ENTRYPOINT. Contrairement au formulaire shell, le formulaire exec ne lance pas un shell de commande. Cela signifie que le traitement shell normal ne se produit pas. Par exemple, ENTRYPOINT [ "echo", "$HOME" ] ne fera pas de substitution de variables sur $HOME. Si vous voulez un traitement shell, utilisez alors le formulaire shell ou exécutez directement un shell, par exemple: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Lorsque vous utilisez le formulaire exec et que vous exécutez directement un shell, comme dans le cas du formulaire shell, c'est le shell qui effectue l'expansion des variables d'environnement, pas docker. (de Documentation Dockerfile)

Dans votre cas, j'utiliserais le formulaire shell

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

3 votes

ENTRYPOINT java -jar /dockertest.jar -Djava.security.egd=file:/dev/./urandom -Dserver.port=$port tandis que ENV port=123. L'ENV de port n'est pas résolu. Des idées pourquoi?

2 votes

Tout en fonctionnant, cela semble créer de nouveaux problèmes, comme ne pas inclure les arguments transmis à ce point d'entrée. Par exemple, vous ne pouvez pas ajouter un argument --attitude "shouting" à la commande docker run qui devrait être transmise à ./greeting

10 votes

Utilisez ENTRYPOINT ./greeting --message "Bonjour, $ADDRESSEE\! $0 $@" si vous souhaitez également transmettre des variables supplémentaires à ./greeting via l'invocation de la commande docker run (ou pour transmettre la commande CMD du fichier Dockerfile)

27voto

mlo55 Points 792

Après beaucoup de douleur, et une grande aide de @vitr et autres ci-dessus, j'ai décidé d'essayer

  • substitution bash standard
  • forme shell de ENTRYPOINT (super astuce ci-dessus)

et cela a fonctionné.

ENV LISTEN_PORT=""

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

par exemple

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

et

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

les deux définissent correctement le port dans mon conteneur

Références

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

26voto

Ben Kauffman Points 9

J'ai essayé de résoudre avec la réponse suggérée et j'ai quand même rencontré quelques problèmes...

C'était une solution à mon problème :

ARG APP_EXE="AppName.exe"
ENV _EXE=${APP_EXE}

# Construire un script shell car la commande ENTRYPOINT n'aime pas utiliser ENV
RUN echo "#!/bin/bash \n mono ${_EXE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh

# Exécuter le script shell généré.
ENTRYPOINT ["./entrypoint.sh"]

Cibler spécifiquement votre problème :

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

0 votes

Il semble que votre réponse ne fournit pas de solutions complètes à la question de l'OP.

0 votes

Je suppose que je ne comprends pas comment cela ne fournit pas de solution à la question de l'OP ... J'ai mis à jour avec un exemple pour résoudre exactement la question en tête.

0 votes

Tu as mentionné que tu as encore rencontré quelques problèmes !!

8voto

Smac89 Points 1926

Pour moi, je voulais stocker le nom du script dans une variable et toujours utiliser la forme exec.

Note: Assurez-vous que la variable que vous essayez d'utiliser est déclarée comme une variable d'environnement soit à partir de la ligne de commande ou via la directive ENV.

Initialement, j'ai fait quelque chose comme:

ENTRYPOINT [ "${BASE_FOLDER}/scripts/entrypoint.sh" ]

Mais évidemment cela n'a pas fonctionné car nous utilisions le shell form et le premier programme listé doit être un exécutable sur le PATH. Pour corriger cela, voici ce que j'ai fini par faire:

ENTRYPOINT [ "/bin/bash", "-c", "exec ${BASE_FOLDER}/scripts/entrypoint.sh \"${@}\"", "--" ]

Note les doubles guillemets sont nécessaires

Ce que cela fait, c'est nous permettre de prendre tous les arguments supplémentaires passés à /bin/bash, et fournir ces mêmes arguments à notre script après que le nom ait été résolu par bash.


man 7 bash

--
Un -- signale la fin des options et désactive tout traitement supplémentaire d'options. Tous les arguments après le -- sont traités comme des noms de fichiers et des arguments. Un argument de - est équivalent à --.

6voto

J'AI RÉSOLU CECI TRÈS SIMPLEMENT!

IMPORTANT: La variable que vous souhaitez utiliser dans le POINT D'ENTRÉE DOIT être de type ENV (et non de type ARG).

EXEMPLE #1:

ARG APP_NAME=app.jar                    # $APP_NAME peut être de type ARG ou ENV.
ENV APP_PATH=app-directory/$APP_NAME    # $APP_PATH doit être de type ENV.
ENTRYPOINT java -jar $APP_PATH

Cela se traduira par l'exécution de : java -jar app-directory/app.jar

EXEMPLE #2 (VOTRE QUESTION):

ARG ADDRESSEE="world"                       # $ADDRESSEE peut être de type ARG ou ENV.
ENV MESSAGE="Hello, $ADDRESSEE!"            # $MESSAGE doit être de type ENV.
ENTRYPOINT ./greeting --message $MESSAGE

Cela se traduira par l'exécution de : ./greeting --message Hello, world!

  • Veuillez vérifier pour être sûr, si vous avez besoin de mettre des guillemets "" lors de l'assignation de variables de type chaîne de caractères.

MON ASTUCE: Utilisez ENV au lieu de ARG chaque fois que possible pour éviter toute confusion de votre part ou du côté du SHELL.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X