Comment définir une variable dans un Dockerfile?

156

Dans mon Dockerfile , je voudrais définir des variables que je pourrai utiliser plus tard dans le Dockerfile .

Je connais l' ENVinstruction, mais je ne veux pas que ces variables soient des variables d'environnement.

Existe-t-il un moyen de déclarer des variables dans la portée Dockerfile ?

Maxime
la source
10
vous pouvez utiliser ARG - voir docs.docker.com/engine/reference/builder/#arg
lumos0815
@ lumos0815, je pense que vous devriez poster cela comme votre réponse (même si c'est un ancien message; pour la postérité) car c'est exactement ce que OP demande.
cri le
ARG ne définit pas une variable qui peut être utilisée dans le fichier docker. Vous devrez associer cela à la commande ENV pour obtenir ce que vous recherchez; ARG foo; ENV FOO = $ foo; COPY file $ foo (désolé pour le mauvais formatage, je suppose qu'il n'est pas possible de faire des blocs de code et des lignes multiples à partir d'un téléphone)
ntwrkguru

Réponses:

111

Vous pouvez utiliser ARG- voir https://docs.docker.com/engine/reference/builder/#arg

L' ARGinstruction définit une variable que les utilisateurs peuvent passer au moment de la construction au générateur avec la docker buildcommande utilisant l' --build-arg <varname>=<value>indicateur. Si un utilisateur spécifie un argument de construction qui n'a pas été défini dans le Dockerfile, la construction génère une erreur.

lumos0815
la source
@MargachChris devrait être possible d'utiliser les variables pour COPY
lumos0815
Cela ne semble pas fonctionner pour la commande COPY. docs.docker.com/engine/reference/builder/#arg
femibyte
54

À ma connaissance, ENVautorise uniquement cela, comme mentionné dans " Remplacement de l'environnement "

Les variables d'environnement (déclarées avec l' ENVinstruction) peuvent également être utilisées dans certaines instructions comme des variables à interpréter par le Dockerfile.

Ils doivent être des variables d'environnement afin d'être redéclarés dans chaque nouveau conteneur créé pour chaque ligne du Dockerfile par docker build.

En d'autres termes, ces variables ne sont pas interprétées directement dans un Dockerfile, mais dans un conteneur créé pour une ligne Dockerfile, d'où l'utilisation de la variable d'environnement.


Aujourd'hui, j'utilise à la fois ARG( docker 1.10+, etdocker build --build-arg var=value ) et ENV.
Utiliser ARGseul signifie que votre variable est visible au moment de la construction, pas au moment de l'exécution.

Mon Dockerfile a généralement:

ARG var
ENV var=${var}

Dans votre cas, cela ARGsuffit: je l'utilise généralement pour définir la variable http_proxy, dont la construction de docker a besoin pour accéder à Internet au moment de la construction.

VonC
la source
51

Pour répondre à ta question:

Dans mon Dockerfile, je voudrais définir des variables que je pourrai utiliser plus tard dans le Dockerfile.

Vous pouvez définir une variable avec:

ARG myvalue=3

Les espaces autour du caractère égal ne sont pas autorisés.

Et utilisez-le plus tard avec:

RUN echo $myvalue > /test
Ortomala Lokni
la source
13

Si la variable est réutilisée dans la même RUNinstruction, on pourrait simplement définir une variable shell. J'aime vraiment la façon dont ils ont abordé cela avec le Ruby Dockerfile officiel .

Evgeny Chernyavskiy
la source
Très bonne réponse. Bien que vous deviez utiliser ARG si possible, vous devez parfois affecter et réutiliser une variable dynamique. Exemple:RUN foo=$(date) && echo $foo
wisbucky
3

Vous pouvez utiliser ARG variable defaultValueet pendant la commande d'exécution, vous pouvez même mettre à jour cette valeur en utilisant --build-arg variable=value. Pour utiliser ces variables dans le fichier docker, vous pouvez les référencer comme $variabledans la commande d'exécution.

Remarque: ces variables seraient disponibles pour les commandes Linux comme RUN echo $variableet elles ne persisteraient pas dans l'image.

user2719152
la source