Ist es möglich, eine ENV
Variable in einer Docker-Datei basierend auf dem Wert eines Builds bedingt festzulegen ARG
?
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
Wenn --build-arg BUILD_ENV=test
ich jedoch mit dem Host renne und dann auf ihn gehe, bekomme ich immer noch
docker run -it mycontainer bin/bash
[root@brbqw1231 /]# echo $NODE_ENV
production
docker
dockerfile
Matthew Herbst
quelle
quelle
RUN if [ "$BUILD_ENV" = "test" ]; then export NODE_ENV=development; fi
. Achten Sie auf die Leerzeichen. Entfernen Sie sie nicht=
anstelle voneq
RUN if [ "${BUILD_ENV}" = "test" ] ;then echo BUILD_ENV=development >>/etc/environment ; fi
Antworten:
Ja, es ist möglich, aber Sie müssen Ihr Build-Argument als Flag verwenden. Sie können die Parametererweiterungsfunktion der Shell verwenden, um den Zustand zu überprüfen. Hier ist eine Proof-of-Concept-Docker-Datei:
Test Build:
quelle
Sie können Bash-Code nicht direkt in der Docker-Datei ausführen , müssen jedoch den
RUN
Befehl verwenden. So zum Beispiel, können Sie ändernENV
mitRUN
und exportieren Sie die Variable in derif
, wie unten:Ich habe es nicht versucht, sollte aber funktionieren.
quelle
RUN export
im resultierenden Bild nicht bestehen bleibt=
anstelle von verwenden müssen==
.Step 9/11 : RUN if [ "$version" = "show"]; then export runCMD=hello; else export runCMD=world; fi ---> Running in 160b291ca7e4 /bin/sh: 1: [: missing ]
]
Sie können zwar keine bedingten
ENV
Variablen festlegen , aber möglicherweise können Sie mit demRUN
Befehl und einer Null-Koaleszenz- Umgebungsvariablen das erreichen, wonach Sie suchen :quelle
Ihre Logik ist tatsächlich richtig. Das Problem hierbei ist, dass
RUN export ...
dies in einer Docker-Datei nicht funktioniert, da derexport
Befehl nicht für alle Bilder bestehen bleibt. Docker-Dateien erstellen einen temporären Container, um das Image dafür zu generieren. Daher sind die Umgebungsvariablen nicht vorhanden.ENV
Auf der anderen Seite heißt es in der Dokumentation :Die einzige Möglichkeit, dies zu tun, besteht darin, während Ihres
docker run
Befehls den Container aus Ihrem Bild zu generieren und Ihre Logik darum zu wickeln:quelle
Übergeben von Werten an Dockerfile und dann an das Einstiegspunktskript
Übergeben Sie über die Befehlszeile Ihren gewünschten Wert (TARG).
Dann
Dockerfile
setzen Sie so etwas einDas
entrypoint.sh
Skript liest nur das erste Argumentquelle
Wenn es sich nur um Umgebungsvariablen handelt, legen Sie diese einfach mit der Produktion fest
Und während des Container-Starts in der Entwicklung können Sie verwenden
-e NODE_ENV=dev
.Auf diese Weise wird das Image immer in die Produktion integriert, aber der lokale Container wird in der Entwicklung gestartet.
quelle