こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileのARGの書き方について記事にしようと思います。
多くの人は「今更ARGなんて覚えることはないよ」と思うかもしれません。でも待ってください。
ARGには事前定義された設定などもありますので、Docker初学習者以外の方にも是非見ていってもらいたいです。
当記事は以下の公式リファレンスを元に記載しております。
Dockerfile reference >>
目次
結論:ARGの書き方
ARGはDockerfile内で変数の役割を担ってくれます。
ARG <name>[=<default value>]
詳細:ARGの使い方
ARG の使い方
ARG <name>[=<default value>]
ARG命令ではDockerfile内で利用する変数を定義することができます。
そのためDockerfile初学習者にとっては真っ先に覚える命令かもしれません。
FROM almalinux:latest
ARG myname="papakoletter"
RUN echo ${myname}
結果(抜粋)
#4 [1/2] FROM docker.io/library/almalinux:latest
#4 sha256:5520e1d01fe824df8e66075fe2a2d2a6c6850c23649fa67e5e1bb4cfc79de76c
#4 CACHED
#5 [2/2] RUN echo papakoletter
#5 sha256:b374374c27c944c981eaec837ac1fd365f7cecb55efa5d216ac34e8ee2c13ae6
#5 0.275 papakoletter
#5 DONE 0.3s
また、この使い方の他に、イメージビルド時に引数として渡してあげる方法もあります。
Dockerfile
FROM almalinux:latest
ARG myname
RUN echo ${myname}
これを以下のように「–build-arg」オプションにて変数を渡してあげることができます。
> docker image build . -t test --build-arg username="papakoletter" --progress plain --no-cache --build-arg myname="papakoletter!"
結果:
#4 [1/2] FROM docker.io/library/almalinux:latest
#4 sha256:5520e1d01fe824df8e66075fe2a2d2a6c6850c23649fa67e5e1bb4cfc79de76c
#4 CACHED
#5 [2/2] RUN echo papakoletter!
#5 sha256:32197423f2458980928143c9866b7fe70b73d8fb344476e12c16dae3a6efd436
#5 0.283 papakoletter!
#5 DONE 0.3s
このように、変数としての使い方、そして起動引数としての使い方ができるのがARG設定となります。
なお、あくまでも「ARG key=value」の使い方は「デフォルト値」の使い方になりますので、以下のようにDockerfileで設定して、かつビルド時に –build-arg を設定した場合は –build-arg の設定が採用されます。
FROM almalinux:latest
ARG myname="papa"
RUN echo${myname}
> docker image build . -t test --build-arg username="papakoletter" --progress plain --no-cache --build-arg myname="papakoletter!"
#4 [1/2] FROM docker.io/library/almalinux:latest
#4 sha256:5520e1d01fe824df8e66075fe2a2d2a6c6850c23649fa67e5e1bb4cfc79de76c
#4 CACHED
#5 [2/2] RUN echo papakoletter!
#5 sha256:32197423f2458980928143c9866b7fe70b73d8fb344476e12c16dae3a6efd436
#5 0.319 papakoletter!
#5 DONE 0.3s
ARG の注意点
ARG 設定内容は第三者から確認可能
ARG設定したイメージは、 docker history コマンドにて、あとから確認することができます。
例えば、以下のDockerfileをイメージビルドします。
FROM almalinux:latest
ARG myname="papa"
ARG securet_key="xxxx yyyy zzzz"
RUN echo ${myname}
生成されるイメージを docker history コマンドで確認してみます。
> docker history test:latest
IMAGE CREATED CREATED BY SIZE COMMENT
ac3ba2c382c7 3 seconds ago RUN |2 myname=papakoletter! securet_key=xxxx… 0B buildkit.dockerfile.v0
<missing> 3 seconds ago ARG securet_key=xxxx yyyy zzzz 0B buildkit.dockerfile.v0
<missing> 3 seconds ago ARG myname=papa 0B buildkit.dockerfile.v0
<missing> 10 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 10 months ago /bin/sh -c #(nop) ADD file:cd828c1795a1635bd… 191MB
これは後から確認出来て嬉しい反面、うっかり機密情報などを設定してしまうと第三者がイメージを取得出来てしまった場合は機密情報が漏れてしまう危険が生じます。
そのため、機密情報の類はARG設定禁止!と覚えておくと良いでしょう。
ただし、以下の変数のみ、Dockerfileでデフォルト利用可能で、–build-arg にて指定してあげることで ARG 命令で定義しなくても暗黙的に利用できるようになります。
ARG 命令をDockerfileに記載するわけではないので docker history による参照はできません。
HTTP_PROXY
http_proxy
HTTPS_PROXY
https_proxy
FTP_PROXY
ftp_proxy
NO_PROXY
no_proxy
ALL_PROXY
all_proxy
Dockerfile
FROM almalinux:latest
RUN echo ${HTTP_PROXY}
RUN echo ${test}
イメージビルド
> docker image build . -t test --build-arg username="papakoletter" --progress plain --no-cache --build-arg HTTP_PROXY="http://xxx.xxx.xxx:8080/papakoletter" --build-arg test="test"
#5 [2/3] RUN echo ${HTTP_PROXY}
#5 sha256:4900fc1708200e252f31c3dd25ecd3f6f0ff6dddb24ba79f2236e98b9377db23
#5 0.311 http://xxx.xxx.xxx:8080/papakoletter
#5 DONE 0.3s
#6 [3/3] RUN echo ${test}
#6 sha256:fd781ddcbe6f5dd5d46e72c9543ee3192fdf0cc99e9d643454d1abd0c8c06f37
#6 0.413
#6 DONE 0.4s
test は –build-arg で引数で渡してあげてますが、ARG 命令で指定していないので echo では何も出力されません。
一方で、HTTP_PROXY も ARG 命令で指定してませんが、 echo で結果出力されてます。
docker history で結果を見てみますと、もちろん、HTTP_PROXYの値が見れることはありません。
> docker history test:latest
IMAGE CREATED CREATED BY SIZE COMMENT
bb06474adc21 36 seconds ago RUN /bin/sh -c echo ${test} # buildkit 0B buildkit.dockerfile.v0
<missing> 36 seconds ago RUN /bin/sh -c echo ${HTTP_PROXY} # buildkit 0B buildkit.dockerfile.v0
<missing> 10 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 10 months ago /bin/sh -c #(nop) ADD file:cd828c1795a1635bd… 191MB
当記事は以上となります。
今回は ARG 命令について説明いたしました。実は buildkidを利用するとさらにデフォルト変数があったりしますが、ややこしくなるので当記事では割愛致します。
長々とお疲れさまでした。