web-dev-qa-db-fra.com

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

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

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

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

75
Psycho Punch

Vous utilisez le formulaire exec de ENTRYPOINT. Contrairement au formulaire Shell , le formulaire exec n'invoque pas de commande Shell. . Cela signifie que le traitement Shell normal ne se produit pas. Par exemple, ENTRYPOINT [ "echo", "$HOME" ] ne fera pas de substitution de variable sur $ HOME. Si vous souhaitez un traitement Shell, utilisez le formulaire Shell ou exécutez-le directement, par exemple: ENTRYPOINT [ "sh", "-c", "echo $HOME" ].
Lors de l'utilisation du formulaire exec et de l'exécution directe d'un shell, comme dans le cas du formulaire shell, c'est le shell qui développe les variables d'environnement, pas le menu fixe. (From référence Dockerfile =)

Dans votre cas, je voudrais utiliser sous forme de shell

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

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

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

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

Cibler spécifiquement votre problème:
RUN echo "#!/bin/bash \n ./greeting --message ${ADDRESSEE}" > ./entrypoint.sh
RUN chmod +x ./entrypoint.sh
ENTRYPOINT ["./entrypoint.sh"]

7
Ben Kauffman

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

  • substitution bash standard
  • Forme de shell de ENTRYPOINT (bonne astuce d'en haut)

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 le port correctement dans mon conteneur

Refs

voir https://www.cyberciti.biz/tips/bash-Shell-parameter- substitution_.html

1
mlo55