Mam plik dockerfile
FROM centos:7
ENV foo=42
potem go buduję
docker build -t my_docker .
i uruchom go.
docker run -it -d my_docker
Czy jest możliwe przekazywanie argumentów z wiersza poleceń i używanie ich z if else w Dockerfile? Mam na myśli coś takiego
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
i buduj z tym argumentem.
docker build -t my_docker . --my_arg=42
docker
dockerfile
nick_gabpe
źródło
źródło
RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi
. Lub jeśli brakuje argumentu:RUN if [ "x$arg" == "x42" ]; then ...
Odpowiedzi:
Może nie wyglądać tak czysto, ale możesz mieć swój plik Dockerfile (warunkowy) w następujący sposób:
a następnie skompiluj obraz jako:
docker build -t my_docker . --build-arg arg=45
lub
docker build -t my_docker .
źródło
[ "$arg" = "x" ]
zamiast tego[ "x$arg" = "x" ]
?if [ $arg != "" ] ;
ale jestem pewien, że jest pewnaif [[ -n "$arg" ]]
prawda, jeśli parametr nie jest pusty,if [[ -z "$arg" ]]
prawda, jeśli parametr jest pusty[ "x$arg" = "x" ]
wygląda na to, że porównuje dwa cytowane ciągi, ale cudzysłowy są usuwane; Dzięki temu składnia jest poprawna. Po cytując złuszczaniu: Dobrze:if x = x ..
. Źle:if =
. JEDNAK istnieją lepsze sposoby sprawdzania istnienia parametru: Sprawdź istnienie argumentów wejściowych .Z jakiegoś powodu większość odpowiedzi mi nie pomogła (może jest to związane z moim obrazem FROM w pliku Dockerfile)
Więc wolałem utworzyć
bash script
w moim obszarze roboczym w połączeniu z--build-arg
, aby obsłużyć instrukcję if podczas kompilacji Dockera, sprawdzając, czy argument jest pusty, czy nieSkrypt Bash:
Dockerfile:
Kompilacja Dockera:
Uwaga: To przejdzie do else (false) w skrypcie bash
Uwaga: to przejdzie do if (true)
Edycja 1:
Po kilku próbach znalazłem następujący artykuł i ten jeden , który pomógł mi zrozumieć 2 rzeczy:
1) ARG przed FROM jest poza kompilacją
2) Domyślną powłoką jest / bin / sh, co oznacza, że if else działa nieco inaczej w kompilacji dockera. na przykład potrzebujesz tylko jednego „=” zamiast „==”, aby porównać ciągi.
Możesz więc to zrobić wewnątrz
Dockerfile
aw
docker build
:źródło
Zgodnie z dokumentacją
docker build
polecenia istnieje parametr o nazwie--build-arg
.Przykładowe użycie:
IMO to jest to, czego potrzebujesz :)
źródło
Istnieje interesująca alternatywa dla proponowanych rozwiązań, która działa z pojedynczym plikiem Dockerfile , wymaga tylko jednego wywołania kompilacji dockera na kompilację warunkową i unika bash .
Rozwiązanie:
Poniższe informacje
Dockerfile
rozwiązują ten problem. Skopiuj, wklej i wypróbuj sam.Wyjaśnienie Dockerfile:
Najpierw otrzymujemy
base
obraz (centos:7
w twoim przypadku) i umieszczamy go na swoim własnym etapie.base
Etap powinien zawierać rzeczy, które chcesz zrobić przed chorobą. Następnie mamy jeszcze dwa etapy, reprezentujące gałęzie naszego stanu:branch-version-1
ibranch-version-2
. Budujemy je obie.final
Etap niż wybiera jeden z tych etapów, na podstawiemy_arg
. Warunkowy plik Dockerfile. Proszę bardzo.Wyjście podczas pracy:
(Skróciłem to trochę ...)
my_arg==2
my_var==1
Dzięki Tõnisowi za ten niesamowity pomysł!
źródło
Aby to zrobić, użyj bezpośrednio pliku binarnego „test”. Powinieneś także użyć polecenia noop „:”, jeśli nie chcesz określać warunku „else”, aby docker nie zatrzymał się z niezerowym błędem wartości zwracanej.
źródło
RUN [ -z "$YOURVAR" ] && ... || :
, jak sądzęRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
&&
przed||
:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"
Dokładnie tak, jak powiedzieli inni, pomoże skrypt powłoki.
Tylko dodatkowy przypadek, o którym warto wspomnieć o IMHO (dla kogoś, kto się tutaj natknie, szukając łatwiejszego przypadku), czyli Wymiana środowiska .
źródło
Odpowiedź Zaakceptowany może rozwiązać problem, ale jeśli chcesz multilinii
if
warunki w dockerfile można zrobić, że umieszczenie\
na końcu każdej linii (podobny do tego, jak to zrobić w skrypcie powłoki) i kończąc każdym poleceniu;
. Możesz nawet zdefiniować coś takiegoset -eux
jak pierwsze polecenie.Przykład:
W Twoim przypadku:
Następnie zbuduj za pomocą:
źródło
Korzystanie ze skryptu Bash i Alpine / Centos
Dockerfile
script.sh
Przechodząc argument:
docker build -t test --build-arg MYARG="this is a test" .
Bez argumentu:
docker build -t test .
źródło