Dockerファイル:【ENVとexport】の違い


はじめに

言葉で説明

  • 中と外
    • 中 …… 実行されているコンテナ内の環境
    • 外 …… docker runを実行している環境
  • ENV
    • Dockerファイルのコマンド
    • コンテナ実行した時に外から値を参照できる
    • コンテナ実行オプションの「-e」で書き換え可能
  • export
    • Linuxの通常の環境変数
    • pipなどと同様の扱いで、RUNコマンドで実行する
    • コンテナ実行した時に外から参照できない
    • また、外から書き換えることもできない
  • どちらもコンテナ内部から見ると同じ変数

以降の実行例の前提

実行例から違いを理解

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」に設定
  • RUN
    • echo \$ADMIN_USER"-file" > ./tmpfile
      • ENV変数を使って組み立てた文字列を「./tmpfile」に書き込み
      • ファイルには「futa-file」が書き込まれる

コンテナ実行で確認

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」に変更
  • 確認
    • ENV変数の確認
      (echo $ADMIN_USRE)
      • 初期値「futa」から書き換わった「happy」が表示された
      • 「-e」オプションで内容が書き換わることが確認できる
    • ファイルの確認
      (cat ./tmpfile)
      • 「RUN」で組み立てた文字列「futa-file」が表示された
      • 内容は書き換わらない
  • 結果考察
    • 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」が書き込まれる

コンテナ実行

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変数の書き換え方法はない

リファレンス


Posted by futa