1
votes

Sélectionnez ENV / ARG dans Dockerfile en fonction de la build ARG

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


6 commentaires

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'obtiens VAR1_WIN comme résultat au lieu de Value4Win


Vous ne pouvez pas passer directement Value4Win ou Value4Unix avec --build-arg à la place?


3 Réponses :


-1
votes

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


0 commentaires

0
votes

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 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 .


0 commentaires

2
votes

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


2 commentaires

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.