docker-composeでnginxを立てる際に、confファイルに環境変数を使う方法について解説します。nginxのversionが1.19より前と後でやり方が異なるので注意してください。
nginx:1.19以降
1.19以降では公式にサポートされている方法を使うことができます。
以下のような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
を以下のように用意します。
server {
server_name localhost;
listen ${PORT};
}
docker-compose up --build
を実行すると、上記ファイルがコンテナ内の/etc/nginx/templates
にマウントされます。
コンテナ内の/etc/nginx/conf.d
を確認すると、以下のように環境変数がセットされたファイルが出力されていることが確認できます。
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
を以下のようにします。これは上記と変わりません。
server {
server_name localhost;
listen ${PORT};
}
init.sh
を以下のようにします。
envsubstコマンドでdefault.conf.template
に環境変数をセットして、結果をdefault.conf
に出力します。nginxを立ち上げるコマンドも忘れずに記載します。
#!/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
で環境変数がセットされたファイルを確認できます。
server {
server_name localhost;
listen 8080;
}
説明に使用したファイルは以下のレポジトリを参照してください。
https://github.com/happyfukumoto/nginx_on_dockercompose