概要
(自分メモ)Dockerでの環境変数に関する実証
何事も実際やってみないとね
まとめ
Dockerfile定義 | --build-arg指定 / 環境変数 |
build時$A /$E
|
run時-e指定 / 環境変数 |
run時$E
|
---|---|---|---|---|
未定義 | - | 未定義 | なし | 未定義 |
ARG A | A / 未定義 | 未定義 | - | 未定義 |
ARG A | A / "env" | "env" | - | 未定義 |
ARG A | A="custom" / - | "custom" | - | 未定義 |
ARG A="default" | A / 未定義 | "default" | - | 未定義 |
ARG A="default" | A / "env" | "env" | - | 未定義 |
ARG A="default" | A="custom" / - | "custom" | - | 未定義 |
未定義 | - | 未定義 | E / 未定義 | 未定義 |
未定義 | - | 未定義 | E / "env" | "env" |
未定義 | - | 未定義 | E="custom" / - | "custom" |
ENV E="default" | - | "default" | E / 未定義 | 未定義 |
ENV E="default" | - | "default" | E / "env" | "env" |
ENV E="default" | - | "default" | E="custom" / - | "custom" |
検証用Dockerfile
テスト用Dockerfile
FROM ubuntu:24.04
#ARG A0 is undefined
ARG A1
ARG A2="A2_default"
#ENV E0 is undefined
ENV E1=$A1
ENV E2="E2_default"
RUN printenv|sort
CMD ["/bin/sh","-c","(printenv|sort)"]
ARG
sudo -E docker build --no-cache --build-arg A0=A0_custom --build-arg A1=A1_custom --build-arg A2=A2_custom -t t1 .
A1=A1_custom
A2=A2_custom
E1=A1_custom
E2=E2_default
- Dockerfileで未定義のA0は、
--build-arg A0=A0_custom
を与えても未定義 - 初期値が与えらてないA1は環境変数として未定義
- E1は初期値"$A1"(="A1_custom")として定義される
A0=A0_env A1=A1_env A2=A2_env sudo -E docker build --no-cache --build-arg A0 --build-arg A1 --build-arg A2 -t t1 .
A1=A1_env
A2=A2_env
E1=A1_env
E2=E2_default
- ビルド中環境変数の内容がセットされる
- Dockerfileで未定義のA0は、 --build-arg A0で環境変数を与えても未定義
sudo -E docker build --no-cache --build-arg A0 --build-arg A1 --build-arg A2 -t t1 .
A2=A2_default
E1=
E2=E2_default
- A0は、Dockerfileで未定義の場合、常に未定義となる
-
--build-arg A1
で環境変数が未定義の場合、未定義となる -
--build-arg A2
で環境変数が未定義の場合、デフォルト値(A2_default
)となる
ENV
検証用コンテナビルド: sudo -E docker build --no-cache -t t1 .
A2=A2_default
E1=
E2=E2_default
sudo docker run --rm t1
E1=
E2=E2_default
- ARGで指定した環境変数はrun時には表れない
sudo docker run -e E0=E0_custom -e E1=E1_custom -e E2=E2_custom --rm t1
E0=E0_custom
E1=E1_custom
E2=E2_custom
-
-e E0=
により、実行時に環境変数を与える。デフォルト値が不要ならDockerfile中にENV指定不要(ARGと異なる)
sudo docker run -e E0 -e E1 -e E2 --rm t1
(空)
-
-e E1
により、実行時、環境変数E1が未定義なら未定義となる。Dockerfileで定義された初期値ではないので注意(ARGと異なる)