J'ai actuellement deux Dockerfiles qui sont identiques à l'exception de quelques variables ENV au début qui ont des valeurs différentes. Je veux les combiner dans un fichier Docker et sélectionner les variables ENV en fonction d'un build-arg / ARG à la place.
J'ai essayé quelque chose comme ça avec $ target soit WIN ou UNIX:
FROM alpine ARG target ARG VAR1_WIN=Value4Win ARG VAR1_UNIX=Value4Unix ARG VAR1=VAR1_$target ARG VAR1=${!VAR1} RUN echo $VAR1
3 Réponses :
Si vous ne pouvez pas passer Value4Win
ou Value4Unix
directement via --build-arg
, voici un moyen:
Step 4/4 : RUN echo $VAR1 ---> Running in 6e94bc28d459 Value4WIN
Faire un docker build --build-arg target = WIN.
donne:
FROM alpine ARG target ARG VAR1=Value4${target} RUN echo $VAR1
La syntaxe de double expansion $ {! VAR}
ne fonctionne que dans bash
, tandis que Dockerfile
n'est pas analysé par le shell. Selon le manuel du docker , Dockerfile code > ne prend pas en charge la double expansion.
Notez que alpin
utilise ash
au lieu de bash
, donc il ne prend pas en charge $ {! VAR}
Soit. Vous devez utiliser eval
+ echo
. Essayez RUN VAR1 = "$ (eval" echo \ $$ VAR1 ")"; echo $ VAR1
.
Pour la syntaxe conditionnelle, il existe un modèle que vous pouvez utiliser avec une construction en plusieurs étapes:
# ARG defined before the first FROM can be used in FROM lines ARG target # first base image for WIN target FROM alpine as base-WIN # switching to ENV since ARG doesn't pass through to the next stage ENV VAR1=Value4Win # second base image for UNIX target FROM alpine as base-UNIX ENV VAR1=Value4Unix # select one of the above images based on the value of target FROM base-${target} as release RUN echo $VAR1
Merci, cela fonctionne parfaitement! Un petit inconvénient est que tous les conteneurs intermédiaires sont toujours construits. Cependant, comme ils ne font que définir des variables ENV, ce n'est pas un réel problème.
Le passage à BuildKit entraînerait la construction uniquement des étapes dépendantes.
Pouvez-vous inclure votre commande de construction qui spécifie les arguments? Construisez-vous avec
--build-arg
?J'ai utilisé
docker build --build-arg target = WIN.
Que doit faire le
!
dans$ {! VAR1}
?Supprimez simplement le
!
.Il est censé doubler VAR1. Avec seulement
$ {VAR1}
, j'obtiensVAR1_WIN
comme résultat au lieu deValue4Win
Vous ne pouvez pas passer directement
Value4Win
ouValue4Unix
avec--build-arg
à la place?