docker-composeでnginxを立てる際に環境変数を使う方法


docker-composeでnginxを立てる際に、confファイルに環境変数を使う方法について解説します。nginxのversionが1.19より前と後でやり方が異なるので注意してください。

nginx:1.19以降

1.19以降では公式にサポートされている方法を使うことができます。
以下のようなdocker-compose.ymlを例に用います。

docker-compose.yml
version: "3"
services:
  nginx_service:
    container_name: nginx
    image: nginx:1.19-alpine
    volumes:
      - ./templates:/etc/nginx/templates
    environment:
      - PORT=8080
    ports:
      - 3000:8080

デフォルトではコンテナ内の/etc/nginx/templates/*.templateが読み込まれ、環境変数をセットした結果が、/etc/nginx/conf.dに吐き出されます。

例えば、default.conf.templateを以下のように用意します。

templates/default.conf.template
server {
  server_name         localhost;
  listen              ${PORT};
}

docker-compose up --buildを実行すると、上記ファイルがコンテナ内の/etc/nginx/templatesにマウントされます。

コンテナ内の/etc/nginx/conf.dを確認すると、以下のように環境変数がセットされたファイルが出力されていることが確認できます。

/etc/nginx/conf.d/default.conf
server {
  server_name         localhost;
  listen              8080;
}

nginx:1.19以前

1.19以前ではenvsubstコマンドを使用して、自前で環境変数をセットする必要があります。
以下のようなdocker-compose.ymlを例に用います。上記との違いは、commandでinit.shを実行していることです。

version: "3"
services:
  nginx_service:
    container_name: nginx_1.19_earlier
    image: nginx:1.18-alpine
    volumes:
      - ./nginx:/etc/nginx/conf.d
    environment:
      - PORT=8080
    ports:
      - 3000:8080
    command: sh /etc/nginx/conf.d/init.sh

default.conf.templateを以下のようにします。これは上記と変わりません。

templates/default.conf.template
server {
  server_name         localhost;
  listen              ${PORT};
}

init.shを以下のようにします。
envsubstコマンドでdefault.conf.templateに環境変数をセットして、結果をdefault.confに出力します。nginxを立ち上げるコマンドも忘れずに記載します。

templates/init.sh
#!/bin/sh

envsubst '$$PORT' < \
  /etc/nginx/conf.d/default.conf.template > \
  /etc/nginx/conf.d/default.conf

nginx -g 'daemon off;'

docker-compose up --buildを実行すると、コンテナ内の/etc/nginx/conf.dで環境変数がセットされたファイルを確認できます。

/etc/nginx/conf.d/default.conf
server {
  server_name         localhost;
  listen              8080;
}

説明に使用したファイルは以下のレポジトリを参照してください。
https://github.com/happyfukumoto/nginx_on_dockercompose