web-dev-qa-db-ja.com

マルチステージDockerfile:FROMの前のARGは置換されません

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を再利用して、デフォルトのビルド変数を1回だけ定義できるようにしたいと思います。 2つのFROMのすぐ下の両方のステージでARGを複製すると、正しく構築されます。

デフォルトで「グローバル」マルチステージARG変数を定義する正しい方法は何ですか?

13

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}"
...
12
Richard Barber

デフォルトで「グローバル」マルチステージ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

3
B12Toaster