95 votes

Conditionnel ENV dans Dockerfile

Est-il possible de manière conditionnelle d'un ENV variable dans un Dockerfile basé sur la valeur de l'accumulation ARG?

Ex: quelque chose comme

ARG BUILDVAR=sad
ENV SOMEVAR=if $BUILDVAR -eq "SO"; then echo "hello"; else echo "world"; fi

Mise à jour: l'utilisation actuelle basée sur Mario réponse:

ARG BUILD_ENV=prod
ENV NODE_ENV=production
RUN if [ "${BUILD_ENV}" = "test" ]; then export NODE_ENV=development; fi

Toutefois, en cours d'exécution avec --build-arg BUILD_ENV=test , puis d'aller sur l'ordinateur hôte, je reçois toujours

docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production

62voto

Ruslan Kabalin Points 1550

Oui, c'est possible, mais vous devez utiliser votre argument comme drapeau. Vous pouvez utiliser le paramètre d'extension de la fonctionnalité de la coque afin de vérifier la condition. Voici une preuve de concept Docker fichier:

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}

Les tests 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

23voto

Mario Cairone Points 212

Vous ne pouvez pas exécuter bash code dans le Dockerfile directement, mais vous devez utiliser le RUN commande. Ainsi, par exemple, vous pouvez modifier ENV avec RUN et l'exportation de la variable dans l' if, comme ci-dessous:

ARG BUILDVAR=sad 
RUN if [ "$BUILDVAR" == "SO"]; \
    then export SOMEVAR=hello; \
    else export SOMEVAR=world; \
    fi 

Je n'ai pas essayer, mais devrait fonctionner.

5voto

Steven de Salas Points 4611

Bien que vous ne pouvez pas définir conditionnel ENV variables, mais vous pouvez être en mesure de réaliser ce que vous êtes après, avec l' RUN de commande et un null-coalescence de la variable d'environnement:

RUN node /var/app/current/index.js --env ${BUILD_ENV:-${NODE_ENV:-"development"}}

5voto

Adel Helal Points 203

Votre logique est correcte. Le problème ici est que, RUN export ... ne fonctionnent pas dans un Dockerfile parce que l' export commande de ne pas persister à travers des images. Dockerfiles créer un temporaire de conteneurs afin de générer l'image pour elle, donc les variables d'environnement ne sont pas exister.

ENV d'autre part, comme pour la documentation états:

Les variables d'environnement définies à l'aide de ENV persistent lorsqu'un conteneur est exécuté à partir de l'image résultante.

La seule façon de le faire c'est au cours de votre docker run commande lors de la création du conteneur de votre image, et l'enveloppe de votre logique autour de:

if [ "${BUILD_ENV}" = "test" ]; then
    docker run -e NODE_ENV=development myimage
else
    docker run myimage
fi

0voto

ropata Points 123

La transmission de valeurs à Dockerfile, puis à entrypoint script

À 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 mettre quelque chose comme ceci

Dockerfile:
# if $TARG is not set then "entrypoint" defaults to Q0_WS01
CMD ./entrypoint.sh ${TARG} Q0_WS01

L' entrypoint.sh script ne lit que le premier argument

entrypoint.sh:
#!/bin/bash
[ $1 ] || { echo "usage: entrypoint.sh <$TARG>" ; exit ; }
target_env=$1

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