目次

目次

Dockerfileの”ENV”と”ARG”と”環境変数”について

アバター画像
江藤 光
アバター画像
江藤 光
最終更新日2017/05/19 投稿日2017/05/19

シェルの環境変数を Dockerfile 内で参照したい

シェルの環境変数を Dockerfile 内で使いたい、という状況がありました。 Dockerfile の公式ドキュメントで環境変数の項目を見ると、次のように書いてありました。

Dockerfile は環境変数( env 命令 で宣言)も解釈できます。命令文字(ステートメント・リテラル)中では、変数の様な構文でエスケープ・シーケンスも扱えます。 Dockerfile の中では、環境変数を $variable_name または ${variable_name} の形式で記述します。これらは同等に扱われます。固定用の構文として典型的に使われるのは、空白スペースを変数名に入れず ${foo}_bar のような変数名で割り当てることです。

正直何を言ってるのかよく分かりません。ドキュメント語って難しいですね。 とりあえず、環境変数は ${変数名} で使うことが出来るようです。

試してみます。環境変数の値を echo してみます。

$ cat Dockerfile
FROM busybox

RUN echo $MES
$ export MES="Hello"
$ docker -f ./Dockerfile .
Sending build context to Docker daemon 46.08 kB
Step 1 : FROM busybox
latest: Pulling from library/busybox
4b0bc1c4050b: Pull complete
Digest: sha256:817a12c32a39bbe394944ba49de563e085f1d3c5266eb8e9723256bc4448680e
Status: Downloaded newer image for busybox:latest
 ---> 7968321274dc
Step 2 : RUN echo $MES
 ---> Running in b66cf0a74daa

 ---> 8cfec385316b

何も出ません。 環境変数、と言っていますがシェルの環境変数とはまた違うものの様です。

ENV 命令

Dockerfile の環境変数についてさらに調べてみました。 環境変数操作のための命令としてENVが用意されており、公式ドキュメントによると

ENV 命令は、環境変数 と 値 のセットです。値は Dockerfile から派生する全てのコマンド環境で利用でき、 インラインで置き換え も可能です。

だそうです。この命令を用いて環境変数に値をセットするみたいですね。

そもそも、環境変数がちゃんと参照できているか確認するため、 先ほどの例をちょっと変えてみましょう。

$ cat Dockerfile
FROM busybox
ENV MES Good-bye

RUN echo $MES
$ export MES="Hello"
$ docker build -f ./Dockerfile .
Sending build context to Docker daemon 45.57 kB
Step 1 : FROM busybox
 ---> 7968321274dc
Step 2 : ENV MES Good-bye
 ---> Running in b26c763e5eb6
 ---> bd1fd8fa61c3
Removing intermediate container b26c763e5eb6
Step 3 : RUN echo $MES
 ---> Running in 8fdbb2ba2767
Good-bye
 ---> b0b6436e4fcb
Removing intermediate container 8fdbb2ba2767
Successfully built b0b6436e4fcb

Good-bye が出ました! 求めてたのと違います Hello と出すことは出来ないのでしょうか?

ARG 命令

ARG 命令は、構築時に作業者が docker build コマンドで使う変数、 –build-arg = フラグを定義するものです。

どうやらこれを使うのが正解らしいです。 シェルの環境変数を渡すのではなく、 docker build コマンドの引数として値を渡すんですね。

(なんでこんな設計にしたのでしょう? Windowsなど非 Linux プラットフォームでの展開を考えるとこれが一番確実だったのでしょうか?)

ということで、ARG を用いてさっきの例を書き直してみました。

$ cat Dockerfile
FROM busybox

ARG MES

RUN echo $MES
$ docker build -f ./Dockerfile --build-arg MES="Hello" .
Sending build context to Docker daemon 45.57 kB
Step 1 : FROM busybox
 ---> 7968321274dc
Step 2 : ARG MES
 ---> Running in 7906249e5907
 ---> accbd650ad66
Removing intermediate container 7906249e5907
Step 3 : RUN echo $MES
 ---> Running in 7df0454e152f
Hello
 ---> 299c562c2bd2
Removing intermediate container 7df0454e152f
Successfully built 299c562c2bd2

これで目出度く、Hello と出力されました。

ちなみに、以下のように書くとデフォルト値をセットできます。 これで、これまで通りに –build-arg 命令なしで実行しても動作させることが出来ます

ARG MES=Good-bye

まとめ

  • Dorkcerfile にシェルから変数を渡すには ARG 命令を用いる
  • Dockerfile の環境変数と シェルの環境変数は意味が異なる
アバター画像

江藤 光

まだまだ気持ちは新人です。

目次