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
36
demandé sur Matthew Herbst 2016-05-05 21:13:22

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.

16
répondu Mario Cairone 2018-03-17 04:07:32

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"}}
4
répondu Steven de Salas 2017-04-13 12:36:27

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
3
répondu Adel Helal 2017-09-17 10:19:00

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
2
répondu Ruslan Kabalin 2018-07-10 11:56:27

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=
0
répondu ropata 2017-09-05 05:41:49