web-dev-qa-db-de.com

Bedingte ENV in Dockerfile

Ist es möglich, eine ENV -Variable in einer Docker-Datei basierend auf dem Wert eines Builds ARG bedingt festzulegen?

Bsp .: so etwas wie

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

Update: aktuelle Nutzung basierend auf Marios Antwort:

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

Laufen mit --build-arg BUILD_ENV=test und dann gehts auf den Host, den ich noch bekomme

docker run -it mycontainer bin/bash
[[email protected] /]# echo $NODE_ENV
production
56
Matthew Herbst

Ja, das ist möglich, aber Sie müssen Ihr Build-Argument als Flag verwenden. Sie können die Funktion Parametererweiterung von Shell verwenden, um die Bedingung zu überprüfen. Hier ist eine Proof-of-Concept-Docker-Datei:

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}

Testversion:

docker build --rm -t env_prod ./
...
docker run -it env_prod bash
[email protected]:/# echo $NODE_ENV 
production
[email protected]:/# exit
docker build --rm -t env_dev --build-arg BUILD_DEVELOPMENT=1 ./
...
docker run -it env_dev bash
[email protected]:/# echo $NODE_ENV
development
20
Ruslan Kabalin

Sie können Bash-Code nicht direkt in der Docker-Datei ausführen, sondern müssen den Befehl RUN verwenden. So können Sie beispielsweise ENV mit RUN ändern und die Variable wie folgt in if exportieren:

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

Ich habe es nicht ausprobiert, sollte aber funktionieren.

14
Mario Cairone

Sie können zwar keine bedingten ENV -Variablen festlegen, aber Sie können möglicherweise mit dem Befehl RUN und einer Null-Koaleszenz -Umgebungsvariablen das erreichen, wonach Sie suchen:

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

Deine Logik ist tatsächlich richtig. Das Problem hier ist, dass RUN export ... funktioniert in einer Docker-Datei nicht, da der Befehl export nicht für alle Bilder beibehalten wird. Dockerfiles erstellen einen temporären Container, um das Image dafür zu generieren, daher sind die Umgebungsvariablen nicht vorhanden.

ENV dagegen laut Dokumentation heißt es:

Die mit ENV festgelegten Umgebungsvariablen bleiben bestehen, wenn ein Container aus dem resultierenden Image ausgeführt wird.

Der einzige Weg, dies zu tun, ist während deines docker run Befehl beim Generieren des Containers aus Ihrem Bild, und wickeln Sie Ihre Logik um das:

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

Übergeben von Werten an Dockerfile und dann an Entypoint-Skript

Übergeben Sie in der Befehlszeile den gewünschten Wert (TARG).

docker run --env TARG=T1_WS01 -i projects/msbob

Dann schreiben Sie so etwas in Ihr Dockerfile

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

Das entrypoint.sh script liest nur das erste Argument

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