Dockerの環境変数の挙動確認

# 概要
(自分メモ)Dockerでの環境変数に関する実証
何事も実際やってみないとね

# まとめ

| Dockerfile定義  | --build-arg指定 <br>/ 環境変数 | build時<br>`$A`/`$E` | run時-e指定<br>/ 環境変数 | 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:テスト用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

```sh: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")として定義される

```sh: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で環境変数を与えても未定義

```sh: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
```sh:検証用コンテナビルド: sudo -E docker build --no-cache -t t1 .
A2=A2_default
E1=
E2=E2_default
```
```sh:sudo docker run --rm t1
E1=
E2=E2_default
```
- ARGで指定した環境変数はrun時には表れない


```sh: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と異なる)

```sh:sudo docker run -e E0 -e E1 -e E2 --rm t1
(空)
```
- `-e E1`により、実行時、環境変数E1が未定義なら未定義となる。Dockerfileで定義された初期値ではないので注意(ARGと異なる)