docker-compose.yml:
version: "3"
services:
ei:
build:
context: .
dockerfile: Dockerfile
args:
NODE_VERSION: 8
HELLO: 5
Dockerfile:
ARG NODE_VERSION
ARG HELLO
FROM node:$NODE_VERSION
RUN echo "-> $HELLO"
RUN echo "-> $NODE_VERSION"
Résulte en:
km@Karls-MBP ~/dev/ve (km/ref) $ docker-compose -f docker-compose.yml build --no-cache
vertica uses an image, skipping
Building ei
Step 1/14 : ARG NODE_VERSION
Step 2/14 : ARG HELLO
Step 3/14 : FROM node:$NODE_VERSION
---> e63de54eee16
Step 4/14 : RUN echo "-> $HELLO"
---> Running in e93d89e15913
->
Removing intermediate container e93d89e15913
---> c305b277291c
Step 5/14 : RUN echo "-> $NODE_VERSION"
---> Running in 39e8e656c0bd
-> 8
Je me demande pourquoi cela ne fonctionne pas. Si je change le numéro de version du noeud, le numéro change.
Les arguments définis sur le fichier de composition sont disponibles sur le fichier Docker mais uniquement avant et sur la FROM
. Après la FROM
, les arguments ne sont pas disponibles:
Une
ARG
déclarée avant uneFROM
est en dehors d'une étape de construction, elle ne peut donc être utilisée dans aucune instruction après uneFROM
. - docker docs
Pourquoi l'argument NODE_VERSION
fonctionne-t-il?
L'argument NODE_VERSION
ne fonctionne pas après la FROM
. L'argument est utilisé uniquement sur la FROM
(FROM node:8
). Après FROM
, il existe une variable d'environnement de l'image avec le même nom. Vous faites donc écho à la variable d'environnement de l'image au lieu de l'argument de votre fichier de composition.
Mais vous pouvez utiliser la valeur par défaut de l'argument après FROM
:
Pour utiliser la valeur par défaut d'une
ARG
déclarée avant la premièreFROM
, utilisez une instructionARG
sans valeur à l'intérieur d'une étape de construction. - docker docs
ARG NODE_VERSION
FROM node:$NODE_VERSION
ARG HELLO
RUN echo "-> $HELLO"
RUN echo "-> $NODE_VERSION"
Pour utiliser et afficher la version du noeud définie dans les arguments, vous devez renommer cet argument. Vous pouvez donc utiliser ce qui suit pour afficher tous vos arguments et la variable d'environnement de l'image:
Dockerfile:
ARG CUSTOM_NODE_VERSION
FROM node:$CUSTOM_NODE_VERSION
ARG CUSTOM_NODE_VERSION
ARG HELLO
RUN echo "-> $HELLO" #output: 5
RUN echo "-> $NODE_VERSION" #output: 8.9.4
RUN echo "-> $CUSTOM_NODE_VERSION" #output: 8
docker-compose.yml:
version: "3"
services:
ei:
build:
context: .
dockerfile: Dockerfile
args:
CUSTOM_NODE_VERSION: 8
HELLO: 5
Au cas où vous seriez venu ici et votre syntaxe et tout irait bien, mais la variable ne passait toujours pas ...
Il se peut que vous essayiez de remplacer une variable déjà définie par l'image parent (dans mon cas, essayez de définir BUNDLE_PATH
qui était déjà défini par l'image parent Ruby
).
Si tel est le cas, vous pouvez simplement renommer l'argument en quelque chose qui n'entrera pas en conflit avec le parent (c'est-à-dire, au lieu de BUNDLE_PATH
, utilisez ARG_BUNDLE_PATH
)!
ARG ARG_BUNDLE_PATH
ENV BUNDLE_PATH=$ARG_BUNDLE_PATH
Voir ce numéro pour plus de détails: https://github.com/moby/moby/issues/34494