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

Alb*_*ole 8 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}"
...
Run Code Online (Sandbox Code Playgroud)

我建立它,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
Run Code Online (Sandbox Code Playgroud)

我想在两个阶段中重用相同的ARG,以便可以只定义一次默认的构建变量。如果在两个阶段中都在两个FROM的正下方复制ARG,它将正确构建。

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

Ric*_*ber 12

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

ARG DARSHAN_VER
Run Code Online (Sandbox Code Playgroud)

在您的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}"
...
Run Code Online (Sandbox Code Playgroud)

  • 让它按照我想要的方式工作的一个关键是:第一个 ARG 需要在文件顶部声明,位于任何阶段的范围之外,并且在第一个 FROM 之前。 (4认同)
  • 完美的!我没有注意到`An ARG 指令在定义它的构建阶段结束时超出范围。要在多个阶段使用 arg,每个阶段都必须包含 ARG 指令。`即使我阅读了该文档两次。 (3认同)
  • 甚至不能远程工作。还是空的。 (3认同)
  • @JohnDibling,是的,谢谢您的澄清,这应该添加到当前的答案中 (2认同)

B12*_*ter 9

以下是文档中的引用:

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

  • 具有默认值的“全局”多阶段 ARG 变量确实存在(即使在您回答时),请参阅此处:https://github.com/moby/moby/issues/37622#issuecomment-412101935 (4认同)