web-dev-qa-db-fra.com

docker-compose construit des arguments ne passant pas à Dockerfile

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.

13
Karl Morrison

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 une FROM est en dehors d'une étape de construction, elle ne peut donc être utilisée dans aucune instruction après une FROM. - 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ère FROM, utilisez une instruction ARG 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
15
Sebastian Brosch

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

0
sarink