214 votes

Dockerfile si else condition avec des arguments externes

J'ai dockerfile

 FROM centos:7
ENV foo=42
 

alors je le construit

 docker build -t my_docker .
 

et l'exécuter.

 docker run -it -d  my_docker
 

Est-il possible de passer des arguments en ligne de commande et de les 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 construire avec cet argument.

  docker build -t my_docker . --my_arg=42
 

274voto

Qasim Sarfraz Points 1672

Cela peut ne pas sembler si propre mais vous pouvez avoir votre fichier Docker (conditionnel) comme suit:

 FROM centos:7
ARG arg
RUN if [ "x$arg" = "x" ] ; then echo Argument not provided ; else echo Argument is $arg ; fi
 

puis construisez l'image en tant que:

docker build -t my_docker . --build-arg arg=45

ou

docker build -t my_docker .

26voto

dsaydon Points 847

Depuis quelques raison que la plupart des réponses ici ne m'aide pas (peut-être que c'est lié à mon image 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 si l'instruction tandis que le Panneau de construire en vérifiant si l'argument est vide ou pas

Script Bash:

#!/bin/bash -x

if test -z $1 ; then 
    echo "The arg is empty"
    ....do something....
else 
    echo "The arg is not empty: $1"
    ....do something else....
fi

Dockerfile:

FROM ...
....
ARG arg
COPY bash.sh /tmp/  
RUN chmod u+x /tmp/bash.sh && /tmp/bash.sh $arg
....

Le Panneau De Construction:

docker build --pull -f "Dockerfile" -t $SERVICE_NAME --build-arg arg="yes" .

Remarque: il ira à l'autre (false) dans le script bash

docker build --pull -f "Dockerfile" -t $SERVICE_NAME .

Remarque: il ira à la si (vrai)

Edit 1:

Après plusieurs essais j'ai trouvé la suite de l'article et de cette un ce qui m'a aidé à comprendre 2 choses:

1) ARG avant à PARTIR de l'extérieur de la construire

2) Le shell par défaut est /bin/sh qui signifie que si le reste est de travailler un peu différente dans le menu fixe construire. par exemple, vous avez seulement besoin d'un "=" au lieu de "==" pour comparer des chaînes de caractères.

De sorte que vous pouvez le faire à l'intérieur de l' Dockerfile

ARG argname=false   #default argument when not provided in the --build-arg
RUN if [ "$argname" = "false" ] ; then echo 'false'; else echo 'true'; fi

et dans l' docker build:

docker build --pull -f "Dockerfile" --label "service_name=${SERVICE_NAME}" -t $SERVICE_NAME --build-arg argname=true .

19voto

barat Points 659

Selon build de commande de la documentation, il y a un paramètre qui s'appelle --build-arg

https://docs.docker.com/engine/reference/commandline/build/#set-build-time-variables-build-arg

Exemple d'utilisation
docker build --build-arg HTTP_PROXY=http://10.20.30.2:1234 .

IMO c'est ce dont vous avez besoin :)

18voto

benjhess Points 61

Utilisez simplement le binaire "test" directement pour le faire. Vous devez également utiliser la commande noop ":" si vous ne souhaitez pas spécifier de condition "else", afin que docker ne s'arrête pas avec une erreur de valeur non nulle.

 RUN test -z "$YOURVAR" || echo "var is set" && echo "var is not set"
RUN test -z "$YOURVAR" && echo "var is not set" || :
RUN test -z "$YOURVAR" || echo "var is set" && :
 

9voto

Jing Li Points 5289

Exactement comme d'autres l'ont dit, script shell pourrait l'aider.

Juste un cas supplémentaire, à mon humble avis il vaut la peine de mentionner (pour quelqu'un d'autre qui trébuchent sur ici, à la recherche d'un plus facile de cas), qui est l'Environnement de remplacement.

Les variables d'environnement (déclarée avec l' ENV déclaration) peut également être utilisé dans certaines instructions comme des variables à être interprété par l' Dockerfile.

L' ${variable_name} de la syntaxe prend également en charge un peu de la norme bash modificateurs comme indiqué ci-dessous:

  • ${variable:-word} indique que si l' variable est définie, alors le résultat sera que de la valeur. Si variable n'est pas définie, alors word sera le résultat.

  • ${variable:+word} indique que si l' variable est définie, alors word sera le résultat, sinon le résultat est la chaîne vide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X