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.

2voto

Scoreby Points 31

Dans mon cas, cela a fonctionné de cette façon : (pour une application Spring Boot dans Docker)

ENTRYPOINT java -DidMachine=${IDMACHINE} -jar my-app-name

et en passant les paramètres lors de l'exécution de Docker

docker run --env IDMACHINE=Idmachine -p 8383:8383 my-app-name

0voto

Pavel Tankov Points 391

Voici ce qui a fonctionné pour moi :

ENTRYPOINT [ "/bin/bash", "-c", "source ~/.bashrc && ./entrypoint.sh ${@}", "--" ]

Maintenant, vous pouvez fournir n'importe quels arguments à la commande docker run tout en lisant toutes les variables d'environnement.

0voto

Alec the Geek Points 1107

J'ai résolu le problème en utilisant une variation de l'approche "créer un script personnalisé" ci-dessus. Comme ceci :

FROM hairyhenderson/figlet
ENV GREETING="Bonjour"
RUN printf '#!/bin/sh\nfiglet -W \${GREETING} \$@\n' > /runme && chmod +x /runme
ENTRYPOINT ["/runme"]
CMD ["Monde"]

Exécuter comme ceci

docker container run -it --rm -e GREETING="G'Day" dockerfornovices/figlet-greeter Alec

0voto

Si quelqu'un veut passer une variable ARG ou ENV à la forme exec de l'ENTRYPOINT, alors un fichier temporaire créé pendant le processus de construction de l'image peut être utilisé.

Dans mon cas, j'ai dû démarrer l'application différemment en fonction de savoir si l'application .NET a été publiée en tant que autonome ou non. Ce que j'ai fait, c'est créer le fichier temporaire et utiliser son nom dans l'instruction if de mon script bash.

Partie de mon dockerfile:

ARG SELF_CONTAINED=true #ENV SELF_CONTAINED=true also works
# Le fichier doit être utilisé comme une variable car il est impossible de passer une variable à l'ENTRYPOINT en utilisant la forme Exec. Le nom du fichier permet de vérifier si l'application est autonome
RUN touch ${SELF_CONTAINED}.txt
COPY run-dotnet-app.sh .
ENTRYPOINT ["./run-dotnet-app.sh", "MyApp" ]

run-dotnet-app.sh:

#!/bin/sh

FILENAME=$1

if [ -f "true.txt" ]; then
   ./"${FILENAME}"
else
   dotnet "${FILENAME}".dll
fi

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