Многоступенчатый Dockerfile: ARG перед FROM не подставляется
Я пишу многоэтапный Dockerfile для утилит darshan:
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}"
...
Я строю это с docker build -t darshan-util:3.6.1 .
и ошибка, которую я получаю:
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
Я хотел бы повторно использовать один и тот же ARG на обоих этапах, чтобы я мог определить переменную сборки по умолчанию только один раз. Если я продублирую ARG на обоих этапах, чуть ниже двух FROM, он будет построен правильно.
Как правильно определить "глобальную" многоступенчатую переменную ARG со значением по умолчанию?
2 ответа
ARG действуют только на этапе построения одного изображения. Для многоэтапного обновления ARG, просто заявив:
ARG DARSHAN_VER
после вашей инструкции.
ср https://docs.docker.com/engine/reference/builder/
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}"
...
Как правильно определить "глобальную" многоступенчатую переменную ARG со значением по умолчанию?
эта функция не существует.
Вот цитаты из документации:
Инструкция ARG выходит из области видимости в конце этапа сборки, где она была определена. Чтобы использовать arg в несколько этапов, каждый этап должен включать инструкцию ARG.
https://docs.docker.com/engine/reference/builder/
ARG, объявленный до FROM, находится вне стадии сборки, поэтому его нельзя использовать ни в одной инструкции после FROM. Чтобы использовать значение по умолчанию для ARG, объявленного перед первым FROM, используйте инструкцию ARG без значения внутри этапа сборки.