J'ai dockerfile
FROM centos:7
ENV foo=42
alors je le construis
docker build -t my_docker .
et exécutez-le.
docker run -it -d my_docker
Est-il possible de passer des arguments à partir de la ligne de commande et de l'utiliser avec if else dans Dockerfile? Je veux dire quelque chose comme
FROM centos:7
if (my_arg==42)
{ENV=TRUE}
else:
{ENV=FALSE}
et construisez avec cet argument.
docker build -t my_docker . --my_arg=42
docker
dockerfile
nick_gabpe
la source
la source
RUN if [ "$arg" == "42" ]; then ENV=TRUE; else ENV=FALSE; fi
. Ou si l'argument peut être manquant:RUN if [ "x$arg" == "x42" ]; then ...
Réponses:
Cela n'a peut-être pas l'air aussi propre, mais vous pouvez avoir votre Dockerfile (conditionnel) comme suit:
puis construisez l'image comme:
docker build -t my_docker . --build-arg arg=45
ou
docker build -t my_docker .
la source
[ "$arg" = "x" ]
place de[ "x$arg" = "x" ]
?if [ $arg != "" ] ;
mais je suis sûr qu'il y a desif [[ -n "$arg" ]]
true si un paramètre n'est pas vide,if [[ -z "$arg" ]]
true si un paramètre est vide[ "x$arg" = "x" ]
on dirait qu'il compare deux chaînes entre guillemets, mais les guillemets sont supprimés; Cela maintient la syntaxe correcte. Après devis de décapage: Bon:if x = x ..
. Bad:if =
. CEPENDANT, il existe de meilleures façons de vérifier l'existence d'un paramètre: Vérifiez l'existence des arguments d'entrée .Pour une raison quelconque, la plupart des réponses ici ne m'ont pas aidé (peut-être est-ce lié à mon image FROM dans le Dockerfile)
J'ai donc préféré créer un
bash script
dans mon espace de travail combiné avec--build-arg
afin de gérer l'instruction if pendant la construction de Docker en vérifiant si l'argument est vide ou nonScript bash:
Dockerfile:
Construction de Docker:
Remarque: cela ira à l'autre (faux) dans le script bash
Remarque: cela ira au if (true)
Modifier 1:
Après plusieurs essais, j'ai trouvé l' article suivant et celui- ci qui m'a aidé à comprendre 2 choses:
1) ARG avant FROM est en dehors de la construction
2) Le shell par défaut est / bin / sh, ce qui signifie que if else fonctionne un peu différemment dans la construction du docker. par exemple, vous n'avez besoin que d'un seul "=" au lieu de "==" pour comparer les chaînes.
Vous pouvez donc le faire à l'intérieur du
Dockerfile
et dans le
docker build
:la source
Selon la documentation de la
docker build
commande , il existe un paramètre appelé--build-arg
.Exemple d'utilisation:
IMO c'est ce dont vous avez besoin :)
la source
Il existe une alternative intéressante aux solutions proposées, qui fonctionne avec un seul Dockerfile , ne nécessite qu'un seul appel à docker build par build conditionnel et évite le bash .
Solution:
Ce qui suit
Dockerfile
résout ce problème. Copiez-collez-le et essayez-le vous-même.Explication de Dockerfile:
Nous obtenons d'abord une
base
image (centos:7
dans votre cas) et la mettons dans sa propre scène. Labase
scène doit contenir les choses que vous voulez faire avant la condition. Après cela, nous avons encore deux étapes, représentant les branches de notre condition:branch-version-1
etbranch-version-2
. Nous construisons les deux. Lafinal
scène choisit l'une de ces étapes, en fonction demy_arg
. Dockerfile conditionnel. Voilà.Sortie lors de l'exécution:
(J'ai abrégé cela un peu ...)
my_arg==2
my_var==1
Merci à Tõnis pour cette incroyable idée!
la source
Utilisez simplement le binaire "test" pour ce faire. Vous devez également utiliser la commande noop ":" si vous ne souhaitez pas spécifier une condition "else", afin que docker ne s'arrête pas avec une erreur de valeur de retour différente de zéro.
la source
RUN [ -z "$YOURVAR" ] && ... || :
, je croisRUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
&&
devant||
:test ! -z "$YOURVAR" && echo "var is set" || echo "var is not set"
Exactement comme d'autres l'ont dit, le script shell aiderait.
Juste un cas supplémentaire, à mon humble avis, il convient de mentionner (pour quelqu'un d'autre qui trébuche ici, à la recherche d'un cas plus facile), c'est le remplacement de l'environnement .
la source
La réponse acceptée peut résoudre la question, mais si vous voulez des
if
conditions multilignes dans le fichier docker, vous pouvez le faire en plaçant\
à la fin de chaque ligne (comme vous le feriez dans un script shell) et en terminant chaque commande par;
. Vous pouvez même définir quelque chose commeset -eux
la 1ère commande.Exemple:
Dans ton cas:
Puis construisez avec:
la source
Utilisation du script Bash et Alpine / Centos
Dockerfile
script.sh
Passer arg:
docker build -t test --build-arg MYARG="this is a test" .
Sans argument:
docker build -t test .
la source