Многоступенчатый 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 без значения внутри этапа сборки.

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

Другие вопросы по тегам