ENV conditionnel dans Dockerfile
est-il possible de définir conditionnellement une variable ENV
dans un fichier Dockerfile basé sur la valeur d'un build ARG
?
Ex: quelque chose comme
ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi
mise à jour: usage actuel basé 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, courir avec --build-arg BUILD_ENV=test
et ensuite aller sur l'hôte, je reçois toujours
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
5 réponses
vous ne pouvez pas exécuter le code bash dans le Dockerfile directement, mais vous devez utiliser la commande RUN
. Ainsi, par exemple, vous pouvez remplacer ENV
par RUN
et exporter la variable dans le if
, comme ci-dessous:
ARG BUILDVAR=sad
RUN if [ "$BUILDVAR" == "SO"]; \
then export SOMEVAR=hello; \
else export SOMEVAR=world; \
fi
Je n'ai pas essayé, mais ça devrait marcher.
alors que vous ne pouvez pas définir de variables conditionnelles ENV
mais vous pouvez être en mesure d'accomplir ce que vous êtes après avec la commande RUN
et un null-coalescing environment variable:
RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}
Votre logique est correcte.
Le problème ici est que RUN export ...
ne fonctionnera pas dans un fichier Dockerfile parce que la commande export
ne persistera pas dans les images.
Dockerfiles crée un conteneur temporaire afin de générer l'image pour lui, donc les variables d'environnement n'existeront pas.
ENV
d'autre part, selon la "documentation 151990920 stipule:
l'ensemble des variables d'environnement l'utilisation de
ENV
persistera lorsqu'un conteneur est lancé à partir de l'image résultante.
la seule façon de faire cela est pendant votre commande docker run
lors de la génération du conteneur à partir de votre image, et envelopper votre logique autour de cela:
if [ "${BUILD_ENV}" = "test" ]; then
docker run -e NODE_ENV=development myimage
else
docker run myimage
fi
Oui, c'est possible, mais vous devez utiliser votre argument comme drapeau. Vous pouvez utiliser expansion de paramètre caractéristique de shell pour vérifier l'état. Voici un fichier de validation de principe Docker:
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}
Test de construire:
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
passer des valeurs à Dockerfile puis à script entrypoint
à Partir de la ligne de commande passe en votre 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 script entrypoint.sh
ne lit que le premier argument
entrypoint.sh:
#!/bin/bash
[ ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; }
target_env=