Edited at

docker build中のコマンドの実行結果を環境変数として登録し、docker runで利用する

More than 1 year has passed since last update.


RUNの実行結果をENVに渡せない問題

Dockerでコンテナアプリケーションを作成していると、ときどきdocker build中のコマンドの実行結果を環境変数に設定し、それをdocker run時に利用したくなります。

# シークレットキーとしてランダム文字列を生成

RUN VAL=$(cat /dev/urandom | base64 | fold -w 64 | head -1)
# 環境変数に設定
ENV VAR=${VAL}

しかし、上記のようにENVを使用しても、docker inspectで見るとVAR=と空っぽになっており、コマンドの実行結果をENVに渡せないことがわかります。


回避策

完全にバッドノウハウですが、下記のようにENTRYPOINTをbashにして、BASH_ENV経由で環境変数を設定してやることで、docker build時の実行結果をdocker runで利用できるようになります。


1. bashのソースファイルを作成する


Dockerfile

RUN echo 'export HOGE="$(cat /dev/urandom | base64 | fold -w 64 | head -1)"' >> ~/.bashrc


のように、bashのソースファイルを作成する。


2. BASH_ENVを設定する


Dockerfile

ENV BASH_ENV=~/.bashrc


で環境変数BASH_ENVを指定し、bash実行時にソースファイルが読まれるようにする。


3. bashでコマンドが実行されるようにする

デフォルトでは /bin/sh -c でコマンドが実行されるため、


Dockerfile

ENTRYPOINT [ "/bin/bash", "-c", "echo $HOGE" ]


でbash経由でコマンドが実行されるようにする。このときJSON形式にしておく。(文字列だと/bin/sh -c "/bin/bash" "-c" "echo $HOME"'が実行されるため)


4. docker run image-name

HOGEの内容が表示される

$ docker run image-name

jLtc7TLU6t75OffBAmz9DCAKndtkxOBVM3DGwCpPM4dDUkB2xYGANUPAUktI+4Tc


docker run時に値を上書きしたい場合

次のような内容で.envファイルを作成し、--env-fileオプションに指定して渡す。


.env

# コンテナ内のBASH_ENV=~/.bashrcを読み込まなくなるおまじない

BASH_ENV

# HOGEを上書き
HOGE=Hello, world!


.envに指定した文字列が表示される

$ docker run --env-file .env image-name

Hello, world!