こんにちは。Яeiです。
今回は、現役エンジニアの私がDockerfileのENVの書き方について記事にしようと思います。
コンテナに環境変数を設定したい場合にENV命令で設定します。
コンテナ化において、環境変数は切っても切れない関係となっておりますので是非、マスターしておきましょう。
当記事は以下の公式リファレンスを元に記載しております。
Dockerfile reference >>
目次
結論:ENVの書き方
書き方は以下となります。
ENV <key>=<value> …
ちなみに、一般的によく見かける以下の記載は非推奨寄りになっておりますのでご注意下さい。
ENV <key> <value> …
※イコールがない記載
この記載は本当によく見かけますし、オフィシャルイメージの多くはこの記載になっている気がします。
しかし、以下のようにドキュメントに明記されており、今は互換性のために利用できますが、将来的に削除される可能性があるとのことです。
The alternative syntax is supported for backward compatibility, but discouraged for the reasons outlined above, and may be removed in a future release.
詳細:ENVの書き方
環境変数の簡単な説明
コンテナ環境では環境変数がとても重要になってきます。
その理由として、モダンアプリケーション開発の勧めとして「設定情報は環境変数に持つ」という方針があります。
環境情報をコードに埋め込むのではなく、環境変数で設定できるようにしておくことで、例えば本番、開発環境での違いを変数の切り替えだけで実現できます。
環境変数は言語やOSに依存することはないため、ポータビリティ性にも富んでいるのです。
Linuxだと「env」コマンドで設定されている環境変数を確認することができます。
例えば、nginxのオフィシャルイメージでコンテナを起動してenvコマンドを実行すると以下のようになります。
$ env
HOSTNAME=92329a868c74
PWD=/
PKG_RELEASE=1~bullseye
HOME=/root
NJS_VERSION=0.7.6
TERM=xterm
SHLVL=1
PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
NGINX_VERSION=1.23.1
_=/usr/bin/env
これはコマンドやシェルですと以下のようにして${}で簡単に値を参照することができます。
$ echo ${HOME}
/root
もちろん、各プログラミング言語でも環境変数を取得する方法が用意されてます。
ENVの使い方
ENV <key>=<value> …
Dockerfileでの定義方法はとても簡単ですが、注意点があります。
それは、上記書き方の「=」がない書き方になります。
今でも多くの文献やオフィシャルイメージでも「=」なしの記載が見受けられますが、これは将来的に使えなくなる可能性があるようです。
https://docs.docker.com/engine/reference/builder/#env
The alternative syntax is supported for backward compatibility, but discouraged for the reasons outlined above, and may be removed in a future release
環境変数設定を複数設定したい場合は以下のように設定できます。
# 一個だけ設定
ENV MY_NAME="rei"
# 複数設定(一行で設定)
ENV TEST1="test1" TEST2="test2" TEST3="test3"
# 複数設定(複数行で設定)
ENV SAMPLE1="sample2" \
SAMPLE2="sample2" \
SAMPLE3="sample3"
# 複数設定(一個ずつ設定)
ENV HOGE1="hoge1"
ENV HOGE2="hoge2"
ENV HOGE3="hoge3"
複数設定については書き方はいくつかありますので好みに応じて使えば良いと思います。
よく見かけるのは一番下の一個ずつ設定している例だと思いますが、体感レベルになります。
ENVの注意点
ENV命令の注意点となりますが、ENV設定内容は第三者に見られる可能性がある前提で検討しておいた方が良いです。
これは、docker historyコマンドでイメージの履歴が見られるためです。
> docker history test:latest
IMAGE CREATED CREATED BY SIZE COMMENT
bb9c67aff72f 2 days ago ENV HOGE3=hoge3 0B buildkit.dockerfile.v0
<missing> 2 days ago ENV HOGE2=hoge2 0B buildkit.dockerfile.v0
<missing> 2 days ago ENV HOGE1=hoge1 0B buildkit.dockerfile.v0
<missing> 2 days ago ENV SAMPLE1=sample2 SAMPLE2=sample2 SAMPLE3=… 0B buildkit.dockerfile.v0
<missing> 2 days ago ENV TEST1=test1 TEST2=test2 TEST3=test3 0B buildkit.dockerfile.v0
<missing> 2 days ago ENV MY_NAME=rei 0B buildkit.dockerfile.v0
<missing> 2 days ago /bin/sh -c #(nop) CMD ["nginx" "-g" "daemon… 0B
<missing> 2 days ago /bin/sh -c #(nop) STOPSIGNAL SIGQUIT 0B
<missing> 2 days ago /bin/sh -c #(nop) EXPOSE 80 0B
<missing> 2 days ago /bin/sh -c #(nop) ENTRYPOINT ["/docker-entr… 0B
~略~
当記事は以上となります。
ENV命令はコンテナに環境変数を設定するために利用します。
特に難しい点はなかったと思いますが、機密情報は入れない、一般的によく見る書き方は実は古い書き方の可能性がある、という点は念頭に入れておいてください。
長々とお疲れさまでした。