ビルド時にエンドポイントやトークン等を変数で渡したいときに、若干のハマリポイントがあります。
ワークディレクトリを変数で設定したいケースで説明します。
失敗例
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