docker-compose.yml で .env に定義した環境変数を設定ファイルにも反映させたい

docker-compose で、DB名、ホスト名、ディレクトリ名など、各種設定ファイルごとに記入するのは管理する上でかなり面倒なので、docker-compose が自動で読み込む .env ファイルに記載された環境変数を、各ファイルに反映させる方法のメモになります。

で、実際にどうしたか(各種の名前を test にしたい場合)

.env

COMPOSE_PROJECT_NAME を設定しておくと、コンテナ名に自動でプレフィックスが付与されます(例: myapp_db_1)。
今回はこれを流用します。

COMPOSE_PROJECT_NAME=test

docker-compose.yml

  1. build>args - Dockerfile に環境変数を渡すために必要です
  2. environment - 下記の command で環境変数を扱えるようにします
  3. volumes - 後で記載している通り、nginx.conf では環境変数を指定した記述がありますが、 それは nginx がそれをよしなに読み替えてくれるわけではありません。 envsubst を使用してコンテナ起動時に実際の値に置換する必要があるため、 イメージには置換前ファイルを、実際に設定ファイルとは別に設置します
  4. coommand - コンテナ起動時に volumes で設定したファイルを envsubst で置換します
version 3.7
#[-略-]
    nginx:
        build:
            args:
                COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME}
        ports:
            - 80:80
        environment:
            COMPOSE_PROJECT_NAME: ${COMPOSE_PROJECT_NAME}
        volumes:
            - ${PWD}/nginx/nginx.conf:/etc/nginx/temp/nginx.conf
        command: >
            /bin/sh -c
            "envsubst '
            $$COMPOSE_PROJECT_NAME
            '< /etc/nginx/temp/nginx.conf
            > /etc/nginx/nginx.conf
            && nginx"
#[-略-]

Dockerfile

docker-compose.yml の build>argis の記述により、Dockerfile へ環境変数が渡されます。 渡された環境変数は Dockerfile で ARG インストラクションでビルド時に扱えるようになります。

FROM nginx:alpine
RUN apk update
RUN apk add vim
RUN apk --no-cache add gettext openssl

ARG COMPOSE_PROJECT_NAME
ARG DOMAIN

#[-略-]
# subject data
ENV SSLSBJ "/C=JP/ST=Tokyo/L=XXX/O=${COMPOSE_PROJECT_NAME}.org./OU=web/CN=*.${DOMAIN}"
#[-略-]

nginx.conf

docker-compose.yml の項に書いた通りで、envsubst によってコンテナ起動時に置換されます。

#[-略-]
    server {
        listen 443 ssl;
        ssl_certificate /etc/nginx/server.crt;
        ssl_certificate_key /etc/nginx/server.key;

        server_name ${DOMAIN};
        root /var/www/html/${COMPOSE_PROJECT_NAME}/public;
#[-略-]

参考サイト