多阶段Dockerfile:FROM之前的ARG不被替换

时间:2018-12-08 10:19:27

标签: docker dockerfile docker-multi-stage-build

我正在为darshan utils编写一个多阶段Dockerfile:

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,这样我就可以一次定义一个默认的构建变量。 如果我在两个阶段中都在两个FROM的正下方复制ARG,则会正确构建。

使用默认值定义“全局”多阶段ARG变量的正确方法是什么?

2 个答案:

答案 0 :(得分:3)

ARG仅在单个映像的构建阶段持续。 对于多阶段,只需说明以下内容即可更新ARG:

ARG DARSHAN_VER

在您的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}"
...

答案 1 :(得分:1)

  

使用默认值定义“全局”多阶段ARG变量的正确方法是什么?

此功能不存在。

以下是文档中的引号:

  

ARG指令在定义它的构建阶段结束时超出范围。要在多个阶段使用arg,每个阶段都必须包含ARG指令。

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

  

在FROM之前声明的ARG在构建阶段之外,因此,FROM之后的任何指令都不能使用它。要使用在第一个FROM之前声明的ARG的默认值,请使用ARG指令,且该值在构建阶段内不存在

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