Est-il possible de définir de manière conditionnelle une variable ENV
dans un fichier Docker en fonction de la valeur d'une construction ARG
?
Ex: quelque chose comme
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
Mise à jour: utilisation actuelle basée sur la réponse de Mario:
ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi
Cependant, en cours d'exécution avec --build-arg BUILD_ENV=test
puis aller sur l'hôte, je reçois toujours
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
Oui, c'est possible, mais vous devez utiliser votre argument de construction comme indicateur. Vous pouvez utiliser la fonctionnalité expansion des paramètres de Shell pour vérifier la condition. Voici un fichier Docker de validation de principe:
FROM debian:stable
ARG BUILD_DEVELOPMENT
# if --build-arg BUILD_DEVELOPMENT=1, set NODE_ENV to 'development' or set to null otherwise.
ENV NODE_ENV=${BUILD_DEVELOPMENT:+development}
# if NODE_ENV is null, set it to 'production' (or leave as is otherwise).
ENV NODE_ENV=${NODE_ENV:-production}
Tester la construction:
docker build --rm -t env_prod ./
...
docker run -it env_prod bash
root@2a2c93f80ad3:/# echo $NODE_ENV
production
root@2a2c93f80ad3:/# exit
docker build --rm -t env_dev --build-arg BUILD_DEVELOPMENT=1 ./
...
docker run -it env_dev bash
root@2db6d7931f34:/# echo $NODE_ENV
development
Vous ne pouvez pas exécuter le code bash directement dans le fichier Dockerfile, mais vous devez utiliser la commande RUN
. Ainsi, par exemple, vous pouvez modifier ENV
avec RUN
et exporter la variable dans le fichier if
, comme ci-dessous:
ARG BUILDVAR=sad
RUN if [ "$BUILDVAR" == "SO"]; \
then export SOMEVAR=hello; \
else export SOMEVAR=world; \
fi
Je ne l'ai pas essayé mais ça devrait marcher.
Vous ne pouvez pas définir de variables conditionnelles ENV
, mais vous pourrez peut-être compléter l'objectif recherché avec la commande RUN
et une variable d'environnement null-coalescing :
RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}
Votre logique est en fait correcte. Le problème ici est que RUN export ...
ne fonctionnera pas dans un fichier Docker car la commande export
ne persistera pas dans les images. Dockerfiles crée un conteneur temporaire afin de générer l'image correspondante. Les variables d'environnement n'existeront donc pas.
ENV
d'autre part selon documentation déclare:
Les variables d'environnement définies à l'aide de
ENV
persisteront lorsqu'un conteneur est exécuté à partir de l'image résultante.
La seule façon de le faire est pendant votre docker run
commande lors de la génération du conteneur à partir de votre image et enroulez votre logique autour de cela:
if [ "${BUILD_ENV}" = "test" ]; then
docker run -e NODE_ENV=development myimage
else
docker run myimage
fi
À partir de la ligne de commande, indiquez la valeur requise (TARG).
docker run --env TARG=T1_WS01 -i projects/msbob
Puis dans votre Dockerfile
mettez quelque chose comme ça
Dockerfile:
# if $TARG is not set then "entrypoint" defaults to Q0_WS01
CMD ./entrypoint.sh ${TARG} Q0_WS01
Le entrypoint.sh
script ne lit que le premier argument
entrypoint.sh:
#!/bin/bash
[ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; }
target_env=$1