Dockerイメージビルド時に変数を渡す

f:id:ingnis:20210619103232j:plain

ビルド時にエンドポイントやトークン等を変数で渡したいときに、若干のハマリポイントがあります。

ワークディレクトリを変数で設定したいケースで説明します。

失敗例

Dockerfile

FROM debian:buster-slim
WORKDIR $WORKDIR

--build-argオプションでワークディレクトリを/app/work_dirのイメージをビルド

docker build --build-arg WORKDIR=/app/work_dir -t arg_test .
docker run -it --name arg_test arg_test bash

ワークディレクトリは作成されませんでした。

root@72c38523bbb4:/# ls
bin  boot  dev  etc  home  lib  lib64  media  mnt  opt  proc  root  run  sbin  srv  sys  tmp  usr  var

成功例

—build-argで指定された変数名はDockerfileでARG命令で定義することで使用することができます。

Dockerfile

FROM debian:buster-slim
ARG WORKDIR
WORKDIR $WORKDIR
docker build --build-arg WORKDIR=/app/work_dir -t arg_test2 .
docker run -it --name arg_test2 arg_test2 bash

今度はワークディレクトリが /app/work_dirになります。

root@97ec5d858bf0:/app/work_dir# pwd
/app/work_dir

イメージビルド時に変数を使用する場合は、以下の2つが必要です

  • build命令 --build-argオプションに引数として渡す
  • DockerfileにARGを設定し使用する

ただし、使用できる命令はADD, COPY, ENV, EXPOSE, LABEL, USER, WORKDIR, VOLUME, STOPSIGNALで、それ以外は指定した値で置き換えられません。

具体的には変数名のままイメージがビルドされます。

また、コンテナには引き継がれないので、コンテナにも環境変数を設定する場合はENV命令を使用する必要があります。

実際に値が使用されているかは docker image historyで確認することができます。

docker image history arg_test2
IMAGE          CREATED       CREATED BY                                      SIZE      COMMENT
93a963df4bc5   3 days ago    WORKDIR /app/work_dir                           0B        buildkit.dockerfile.v0
<missing>      3 days ago    ARG WORKDIR                                     0B        buildkit.dockerfile.v0
<missing>      5 weeks ago   /bin/sh -c #(nop)  CMD ["bash"]                 0B
<missing>      5 weeks ago   /bin/sh -c #(nop) ADD file:7362e0e50f30ff454…   69.3MB

we are hiring! ingage.co.jp