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_WINcomme résultat au lieu deValue4WinVous ne pouvez pas passer directement
Value4WinouValue4Unixavec--build-argà la place?