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?
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}"
...
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