71336
docker-compose.ymlにある、environmentに設定する値を環境によって変更したいと思っています。

```

    environment:
            PASS: ここの文字を環境によって変えたい
    
```

様々な記事を参考にして、以下のことは理解できました。

  * `docker-compose` コマンドで変数を指定できる
  * `.env` ファイルごとに変更したい値を記述して、分けられる

しかし、コマンド等で環境を指定し、ロードする.envファイルを変更するにはどうすれば良いのかわかりません。

Dockerの環境変数のあり方と自分の考え方が異なるのか、単純に理解不足なのか、是非教えて頂けると幸いです。
CC BY-SA 4.0
2020-10-19T10:46:19.560
71325
2020-10-20T06:43:55.397
2020-10-20T06:43:55.397
3060
25223
question
docker
docker-compose.ymlで環境変数を使用したい
例えば次のような`sample`ディレクトリにファイルを設置します。

```

    sample
    ├── docker-compose.yml
    └── main.js
    
```

**main.js**

```

    // 指定された環境変数を出力する
    console.log({
      HOGE: process.env.HOGE,
      FUGA: process.env.FUGA,
    });
    
```

**docker-compose.yml**

docker-compose.ymlの中ではホストマシンの環境変数が`$VAR`などのように利用可能です。

```

    version: "3.8"
    services:
      confirm:
        image: node:12.14.0-alpine
        command: node /app/main.js
        volumes:
          - ./main.js:/app/main.js
        environment:
          # ホストの環境変数HOGEをそのままの変数名で読み込む
          - HOGE
          # ホストの環境変数HOST_FUGAをFUGAという変数名に変更して読み込む
          - FUGA=$HOST_FUGA
    
```

**実行**

ホストマシンで次のように環境変数を指定して、`docker-compose`を起動します。

```

    # 環境変数HOGEにHELLOを指定
    export HOGE=HELLO
    # 環境変数HOST_FUGAにWORLDを指定
    export HOST_FUGA=WORLD
    
    doccker-compose up
    
```

**出力結果**

```

    { HOGE: 'HELLO', FUGA: 'WORLD' }
    
```

少なくとも、`docker-compose`を実行する前にホスト側の環境変数に指定されていれば、起動したコンテナに環境変数がセットされます。

`.env`ファイルなどに吐き出して読み込む方法もありますが、機密性の高い情報はインメモリーな場所に保管しておくと良いでしょう。

## 参考

  * [Environment variables in Compose](https://docs.docker.com/compose/environment-variables/)

**余談**

少し余談ですが、Kubernetesには環境変数を管理するためだけの[Secrets](https://kubernetes.io/ja/docs/concepts/configuration/secret/)という機構があります。こういったものも参考にされると環境変数の取り扱い方の視野が広がるでしょう。
CC BY-SA 4.0
2020-10-20T03:26:53.837
71336
2020-10-20T03:34:50.707
2020-10-20T03:34:50.707
7997
7997
71325
answer