勉強日記

チラ裏

docker-composeのenvの適用優先度

調査結果

laradockの.envは、同名の環境変数を複数設定した場合、後に設定したもので上書きされる

動機

  1. laradockを使用している
  2. laradockの.envファイルをカスタマイズしている
  3. laradockがバージョンアップし、docker-compose.ymlとenv-exampleに更新があった
  4. 2.の.envファイルは設定項目に不足があり、docker-compose build等のコマンドが通らなくなる
### pgAdmin ##############################################
    pgadmin:
      container_name: pgadmin
      image: dpage/pgadmin4:latest
      environment:
        - "PGADMIN_DEFAULT_EMAIL=${PGADMIN_DEFAULT_EMAIL}"
        - "PGADMIN_DEFAULT_PASSWORD=${PGADMIN_DEFAULT_PASSWORD}"
      ports:
        - "${PGADMIN_PORT}:80"
      volumes:
        - ${DATA_PATH_HOST}/pgadmin:/var/lib/pgadmin
      depends_on:
        - postgres
      networks:
        - frontend
        - backend

最近あったやつ

env-exampleにPGADMIN_PORTの設定が追加されたが、カスタムしている.envには設定がないため、

      ports:
        - ":80"

に展開されてパースエラーとなる

疑問

cat env-example env-diff > .env

または

cat env-diff env-example > .env

とすれば、設定項目不足で死ぬことはなくなるのでは?

調査

version: "3"
services:
  busybox:
    image: busybox:latest
    environment:
      - MY_ENV=${MY_ENV}

.env

MY_ENV=1
MY_ENV=2
  • envを展開したコンフィグを見る
docker-compose config
services:
  busybox:
    environment:
      MY_ENV: '2'
    image: busybox:latest
version: '3.0'

後に書いたMY_ENV=2が反映された。

したがって、

cat env-example env-diff > .env

で.envを作れば、laradockを更新しても死ななくなる!