web-dev-qa-db-fra.com

ENV conditionnel dans Dockerfile

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
56
Matthew Herbst

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
20
Ruslan Kabalin

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.

14
Mario Cairone

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"}}
4
Steven de Salas

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
3
Adel Helal

Passer des valeurs à Dockerfile puis au script entrypoint

À 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
0
roblogic