Dockerファイル:【ENVとexport】の違い
はじめに
言葉で説明
- 中と外
- 中 …… 実行されているコンテナ内の環境
- 外 …… docker runを実行している環境
- ENV
- Dockerファイルのコマンド
- コンテナ実行した時に外から値を参照できる
- コンテナ実行オプションの「-e」で書き換え可能
- export
- Linuxの通常の環境変数
- pipなどと同様の扱いで、RUNコマンドで実行する
- コンテナ実行した時に外から参照できない
- また、外から書き換えることもできない
- どちらもコンテナ内部から見ると同じ変数
以降の実行例の前提
- Dockerの基本コマンド
- Linuxヒアドキュメント使ったdocker buildの実行
実行例から違いを理解
ENV
イメージ作成
sudo docker build -t sample-image -<<+
# syntax=docker/dockerfile:1
FROM alpine
ENV ADMIN_USER="futa"
RUN echo \$ADMIN_USER"-file" > ./tmpfile
+
sudo docker images
$ sudo docker build -t sample-image - <<+ > # syntax=docker/dockerfile:1 > FROM alpine > ENV ADMIN_USER="futa" > RUN echo \$ADMIN_USER"-file" > ./tmpfile > + Sending build context to Docker daemon 2.048kB Step 1/3 : FROM alpine ---> c059bfaa849c Step 2/3 : ENV ADMIN_USER="futa" ---> Running in a37f67e96a9f Removing intermediate container a37f67e96a9f ---> 3101f6b3e6cc Step 3/3 : RUN echo $ADMIN_USER"-file" > ./tmpfile ---> Running in 4196b63c6028 Removing intermediate container 4196b63c6028 ---> 11b596c80852 Successfully built 11b596c80852 Successfully tagged sample-image:latest $ sudo docker images REPOSITORY TAG IMAGE ID CREATED SIZE sample-image latest 11b596c80852 25 seconds ago 5.59MB alpine latest c059bfaa849c 2 months ago 5.59MB hello-world latest feb5d9fea6a5 4 months ago 13.3kB ubuntu 12.04 5b117edd0b76 4 years ago 104MB dockersamples/static-site latest f589ccde7957 5 years ago 191MB
- ENV
- ADMIN_USER="futa"
- 変数「ADMIN_USER」を作成する
- 初期値を「futa」に設定
- ADMIN_USER="futa"
- RUN
- echo \$ADMIN_USER"-file" > ./tmpfile
- ENV変数を使って組み立てた文字列を「./tmpfile」に書き込み
- ファイルには「futa-file」が書き込まれる
- echo \$ADMIN_USER"-file" > ./tmpfile
コンテナ実行で確認
sudo docker run --rm sample-image sh -c '\
echo -----;\
echo $ADMIN_USER;\
echo -----;\
cat ./tmpfile;\
echo -----;\
' # コンテナ実行
----- futa ----- futa-file -----
- ENV変数の確認
(echo $ADMIN_USRE)- 初期値「futa」が表示された
- ファイルの確認
(cat ./tmpfile)- 「RUN」で組み立てた文字列「futa-file」が表示された
- 結果考察
- ENV変数は外から直接内容を確認できる
- ENV変数の値を使ってファイル書き込みができる
コンテナ実行(「-e」で書き換え)
sudo docker run --rm -e ADMIN_USER=happy sample-image sh -c '\
echo -----;\
echo $ADMIN_USER;\
echo -----;\
cat ./tmpfile;\
echo -----;\
'
----- happy ----- futa-file -----
- 書き換え
- -e ADMIN_USER=happy
- ENV環境変数を書き換える
- 「happy」に変更
- -e ADMIN_USER=happy
- 確認
- ENV変数の確認
(echo $ADMIN_USRE)- 初期値「futa」から書き換わった「happy」が表示された
- 「-e」オプションで内容が書き換わることが確認できる
- ファイルの確認
(cat ./tmpfile)- 「RUN」で組み立てた文字列「futa-file」が表示された
- 内容は書き換わらない
- ENV変数の確認
- 結果考察
- ENV変数はコンテナ実行(docker run)時の「-e」オプションで書き換えられる
- しかし、RUNの実行時点にさかのぼって書き換えられない
export
- 上記に続けて実行する場合は先にイメージ削除
- sudo docker rmi sample-image # イメージ削除
- sudo docker images # イメージ削除確認
イメージ作成
sudo docker build -t sample-image - <<+
# syntax=docker/dockerfile:1
FROM alpine
RUN export ADMIN_USER="futa" \
&& echo \$ADMIN_USER"-file" > ./tmpfile
+
sudo docker images
$ sudo docker build -t sample-image - <<+ # イメージビルド > # syntax=docker/dockerfile:1 > FROM alpine > RUN export ADMIN_USER="futa" \ > && echo \$ADMIN_USER"-file" > ./tmpfile > + Sending build context to Docker daemon 2.048kB Step 1/2 : FROM alpine ---> c059bfaa849c Step 2/2 : RUN export ADMIN_USER="futa" && echo $ADMIN_USER"-file" > ./tmpfile ---> Running in 5f8431a04951 Removing intermediate container 5f8431a04951 ---> 915fb09d24fd Successfully built 915fb09d24fd Successfully tagged sample-image:latest $ sudo docker images # 作成イメージ確認 REPOSITORY TAG IMAGE ID CREATED SIZE sample-image latest 915fb09d24fd 46 seconds ago 5.59MB alpine latest c059bfaa849c 2 months ago 5.59MB hello-world latest feb5d9fea6a5 4 months ago 13.3kB ubuntu 12.04 5b117edd0b76 4 years ago 104MB dockersamples/static-site latest f589ccde7957 5 years ago 191MB
- RUN
- export ADMIN_USER="futa"
- 変数「ADMIN_USER」を作成する
- 初期値を「futa」に設定
- echo \$ADMIN_USER"-file" > ./tmpfile
- export変数を使って組み立てた文字列を「./tmpfile」に書き込み
- ファイルには「futa-file」が書き込まれる
- export ADMIN_USER="futa"
コンテナ実行
sudo docker run --rm sample-image sh -c '\
echo -----;\
echo $ADMIN_USER;\
echo -----;\
cat ./tmpfile;\
echo -----;\
'
----- ----- futa-file -----
- export変数の確認
(echo $ADMIN_USRE)- 何も表示されない
- ファイルの確認
(cat ./tmpfile)- 「RUN」で組み立てた文字列「futa-file」が表示された
- 結果考察
- export変数の内容を外から直接確認することはできない
- ファイルに出力するなどして間接的に確認することはできる
- 補足
- export変数の書き換え方法はない
リファレンス
- Best practices for writing Dockerfiles | Docker Documentation
- Dockerファイルのベストプラクティス
