Dockerfileの FROM句で、いわゆる、こういう事がしたかった

1
FROM debian:$VERSION

一度やろうとして出来ないと思ってたけど、ちゃんと調べたら出来たのでメモ

最初のFROM句より前にARGを書く

たとえばこういうDockerfile

1
2
3
4
ARG VERSION    // ←ARG追加

FROM debian:$VERSION
RUN cat /etc/debian_version

ビルドするとこんな感じ

1
2
3
4
5
6
7
8
9
10
11
12
13
// build-argでバージョン指定
$ docker build --no-cache --build-arg VERSION=buster -t hoge:latest .
Sending build context to Docker daemon 2.048kB
Step 1/3 : ARG VERSION
Step 2/3 : FROM debian:$VERSION
---> 1b686a95ddbf
Step 3/3 : RUN cat /etc/debian_version
---> Running in 8ba619661b8e
10.4
Removing intermediate container 8ba619661b8e
---> 2491b9b8db7c
Successfully built 2491b9b8db7c
Successfully tagged hoge:latest

マルチステージの場合(誤)

直感的に、こう書くとエラーになる

1
2
3
4
5
6
7
8
9
// 1つ目のステージ
FROM debian:stretch as dummy
RUN cat /etc/debian_version

ARG VERSION // ←ARG追加

// 2つ目のステージ
FROM debian:$VERSION
RUN cat /etc/debian_version

ビルドするとこんな感じ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
$ docker build --no-cache --build-arg VERSION=buster -t hoge:latest .
Sending build context to Docker daemon 2.048kB
Step 1/5 : FROM debian:stretch as dummy
---> 62ace29a8c8f
Step 2/5 : RUN cat /etc/debian_version
---> Running in c4ca256000ad
9.13
Removing intermediate container c4ca256000ad
---> e8488c41ff8a
Step 3/5 : ARG VERSION
---> Running in d11cca5fc3d6
Removing intermediate container d11cca5fc3d6
---> 8aa7abe6cc5c
Step 4/5 : FROM debian:$VERSION
invalid reference format // ←とてもエラー

マルチステージの場合(正)

Dockerfile内で登場する最初のFROM句より前にARGを書くと期待した結果が得られる

1
2
3
4
5
6
7
8
9
ARG VERSION    // ←ARG追加

// 1つ目のステージ
FROM debian:stretch as dummy
RUN cat /etc/debian_version

// 2つ目のステージ
FROM debian:$VERSION
RUN cat /etc/debian_version

ビルドするとこんな感じ

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
$ docker build --no-cache --build-arg VERSION=buster -t hoge:latest .
Sending build context to Docker daemon 2.048kB
Step 1/5 : ARG VERSION
Step 2/5 : FROM debian:stretch as dummy
---> 62ace29a8c8f
Step 3/5 : RUN cat /etc/debian_version
---> Running in f4d4cb2f59a6
9.13
Removing intermediate container f4d4cb2f59a6
---> b80c406abe71
Step 4/5 : FROM debian:$VERSION
---> 1b686a95ddbf
Step 5/5 : RUN cat /etc/debian_version
---> Running in 01d38992597f
10.4
Removing intermediate container 01d38992597f
---> 9e976d4e5ca1
Successfully built 9e976d4e5ca1
Successfully tagged hoge:latest