Ich habe Docker-Datei
FROM centos:7
ENV foo=42
dann baue ich es
docker build -t my_docker .
und starte es.
docker run -it -d my_docker
Ist es möglich, Argumente über die Befehlszeile zu übergeben und mit if else in Dockerfile zu verwenden? Ich meine so etwas wie
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
und mit diesem Argument bauen.
docker build -t my_docker . --my_arg=42
docker
dockerfile
nick_gabpe
quelle
quelle
RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi
. Oder wenn arg fehlen könnte:RUN if [ "x$arg" == "x42" ]; then ...
Antworten:
Es sieht vielleicht nicht so sauber aus, aber Sie können Ihre Docker-Datei (bedingt) wie folgt haben:
und erstellen Sie dann das Image als:
docker build -t my_docker . --build-arg arg=45
oder
docker build -t my_docker .
quelle
[ "$arg" = "x" ]
statt sein[ "x$arg" = "x" ]
?if [ $arg != "" ] ;
aber ich bin mir sicher, dass es einige Fallstricke gibt, mit denen ich nicht vertraut binif [[ -n "$arg" ]]
wahr, wenn ein Parameter nicht leer ist,if [[ -z "$arg" ]]
wahr, wenn ein Parameter leer ist[ "x$arg" = "x" ]
sieht so aus, als würden zwei Zeichenfolgen in Anführungszeichen verglichen, aber die Anführungszeichen werden entfernt. Dadurch bleibt die Syntax korrekt. Nach dem Strippen des Zitats: Gut :if x = x ..
. Schlecht :if =
. Es gibt jedoch bessere Möglichkeiten, die Existenz eines Parameters zu überprüfen: Überprüfen Sie die Existenz von Eingabeargumenten .Laut dem Dokument für den
docker build
Befehl gibt es einen Parameter namens--build-arg
.Anwendungsbeispiel:
IMO ist es was du brauchst :)
quelle
Aus irgendeinem Grund haben mir die meisten Antworten hier nicht geholfen (vielleicht hängt es mit meinem FROM-Image in der Docker-Datei zusammen)
Daher habe ich es vorgezogen,
bash script
in meinem Arbeitsbereich eine Kombination mit zu erstellen--build-arg
, um die if-Anweisung während der Docker-Erstellung zu verarbeiten, indem überprüft wird, ob das Argument leer ist oder nichtBash-Skript:
Dockerfile:
Docker Build:
Anmerkung: Dies geht zu else (false) im Bash-Skript
Bemerkung: Dies geht an das if (true)
Bearbeiten 1:
Nach mehreren Versuchen habe ich folgendes gefunden Artikel und dieses ein der mir geholfen hat, zwei Dinge zu verstehen:
1) ARG vor FROM befindet sich außerhalb des Builds
2) Die Standard-Shell ist / bin / sh, was bedeutet, dass if if im Docker-Build etwas anders funktioniert. Zum Beispiel benötigen Sie nur ein "=" anstelle von "==", um Zeichenfolgen zu vergleichen.
Sie können dies also in der
Dockerfile
und in der
docker build
:quelle
Es gibt eine interessante Alternative zu den vorgeschlagenen Lösungen, die mit einer einzelnen Docker-Datei funktioniert , nur einen einzigen Aufruf des Docker- Builds pro bedingtem Build erfordert und Bash vermeidet .
Lösung:
Das Folgende
Dockerfile
löst dieses Problem. Kopieren Sie es und fügen Sie es selbst ein.Erklärung der Docker-Datei:
Wir bekommen zuerst ein
base
Bild (centos:7
in Ihrem Fall) und stellen es auf eine eigene Bühne. Diebase
Bühne sollte Dinge enthalten, die Sie vor der Bedingung tun möchten. Danach haben wir zwei weitere Stufen, die die Zweige unseres Zustands darstellen:branch-version-1
undbranch-version-2
. Wir bauen beide. Diefinal
Bühne wählt dann eine dieser Stufen aus, basierend aufmy_arg
. Bedingte Docker-Datei. Los geht's.Ausgabe beim Ausführen:
(Ich habe das ein wenig abgekürzt ...)
my_arg==2
my_var==1
Vielen Dank an Tõnis für diese tolle Idee!
quelle
Verwenden Sie dazu einfach die "Test" -Binärdatei direkt. Sie sollten auch den Befehl noop ":" verwenden, wenn Sie keine "else" -Bedingung angeben möchten, damit Docker nicht mit einem Rückgabewert ungleich Null stoppt.
quelle
RUN [ -z "$YOURVAR" ] && ... || :
ich glaubeRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
&&
vor||
:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"
Genau wie andere sagten, würde Shell-Skript helfen.
Nur ein zusätzlicher Fall, IMHO ist es erwähnenswert (für jemanden, der hier stolpert und nach einem einfacheren Fall sucht), das ist ein Ersatz für die Umgebung .
quelle
Die akzeptierte Antwort kann die Frage lösen. Wenn Sie jedoch mehrzeilige
if
Bedingungen in der Docker-Datei wünschen, können Sie diese\
am Ende jeder Zeile platzieren (ähnlich wie in einem Shell-Skript) und jeden Befehl mit beenden;
. Sie können sogar etwas wieset -eux
den 1. Befehl definieren.Beispiel:
In deinem Fall:
Dann bauen mit:
quelle
Verwenden von Bash-Skript und Alpine / Centos
Dockerfile
script.sh
Passing arg:
docker build -t test --build-arg MYARG="this is a test" .
Ohne Argument:
docker build -t test .
quelle