web-dev-qa-db-fra.com

Dockerfile à plusieurs étapes: ARG avant FROM non substitué

J'écris un Dockerfile en plusieurs étapes pour les darshan utils :

ARG DARSHAN_VER=3.1.6

FROM Fedora:29 as build
RUN dnf install -y \
        gcc \
        make \
        bzip2 bzip2-devel zlib zlib-devel
RUN curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz" \
    && tar ...


FROM Fedora:29
COPY --from=build "/usr/local/darshan-${DARSHAN_VER}" "/usr/local/darshan-${DARSHAN_VER}"
...

Je le construis avec docker build -t darshan-util:3.6.1 . et l'erreur que j'obtiens est:

Step 5/10 : RUN curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz"     && tar ...

 ---> Running in 9943cce1669c
  % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
...
curl: (78) RETR response: 550
The command '/bin/sh -c curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz"     && tar ...' returned a non-zero code: 78

Je voudrais réutiliser le même ARG dans les deux étapes, afin de pouvoir définir une seule variable de construction par défaut une seule fois. Si je duplique ARG dans les deux étapes, juste en dessous des deux FROM, il se construit correctement.

Quelle est la bonne façon de définir une variable ARG multi-étape "globale" avec une valeur par défaut?

13
Alberto Chiusole

Les ARG ne durent que pour la phase de construction d'une seule image. Pour les étages multiples, renouvelez l'ARG en indiquant simplement:

ARG DARSHAN_VER

après vos instructions FROM.

cf. https://docs.docker.com/engine/reference/builder/#arg

ARG DARSHAN_VER=3.1.6

FROM Fedora:29 as build
ARG DARSHAN_VER
RUN dnf install -y \
        gcc \
        make \
        bzip2 bzip2-devel zlib zlib-devel
RUN curl -O "ftp://ftp.mcs.anl.gov/pub/darshan/releases/darshan-${DARSHAN_VER}.tar.gz" \
    && tar ...


FROM Fedora:29
ARG DARSHAN_VER
COPY --from=build "/usr/local/darshan-${DARSHAN_VER}" "/usr/local/darshan-${DARSHAN_VER}"
...
12
Richard Barber

Quelle est la bonne façon de définir une variable ARG multi-étape "globale" avec une valeur par défaut?

cette fonctionnalité n'existe pas.

Voici des citations de la documentation:

Une instruction ARG sort du cadre à la fin de la phase de génération où elle a été définie. Pour utiliser un argument en plusieurs étapes, chaque étape doit inclure l'instruction ARG.

https://docs.docker.com/engine/reference/builder/#scope

Un ARG déclaré avant un FROM est en dehors d'une étape de construction, il ne peut donc pas être utilisé dans aucune instruction après un FROM. Pour utiliser la valeur par défaut d'un ARG déclaré avant le premier FROM, utilisez une instruction ARG sans valeur à l'intérieur d'une étape de génération

https://docs.docker.com/engine/reference/builder/#understand-how-arg-and-from-interact

3
B12Toaster