以下のようなDockerfileを作った。
ARG VERSION=latest
FROM busybox:$VERSION
RUN echo $VERSION > /opt/image_version
# ...
/opt/ubuntu_version
には latest
が書き込まれることを期待したが実際には空。
なんでだーと思ったらちゃんと公式ドキュメントに書いてある。
An ARG declared before a FROM is outside of a build stage, so it can’t be used in any instruction after a FROM. To use the default value of an ARG declared before the first FROM use an ARG instruction without a value inside of a build stage:
意訳。
FROMより前に定義されたARGはビルドステージ外にあります。よって(FROM以降は別のビルドステージになるため)FROM以降はARGを使うことはできません。
FROMより前に定義されたARGのデフォルト値を使えるようにするには、ビルドステージの中でARGを使ってください。このとき、ARGにはデフォルト値を指定しないでください。
FROM以降はARGがリセットされるようなイメージなのかな。
だから$VERSIONで参照しても定義されていないから空文字が出力される。
FROM以降で改めてARG VERSIONを定義すればいいらしい。
ARG VERSION=latest
FROM busybox:$VERSION
# これ❗
ARG VERSION
RUN echo $VERSION > /opt/image_version
# ...
こうすると /opt/ubuntu_version
には latest
が書き込まれる。
よかったよかった。