こんにちは、ニキです。
DockerとNginxを組み合わせて使用する場合、設定ファイルに環境変数を含めて柔軟に設定を変更したい場面が多々あります。今回は、envsubst
というツールを利用して、Nginxの設定ファイルにDockerの環境変数を埋め込む方法を紹介します。
envsubstとは?
envsubst
は、シェルの環境変数をテキスト内に置換するためのコマンドラインツールです。
環境変数を活用したNginx設定
テンプレートを作成
nginx.conf.template
という名前でNginxの設定テンプレートを作成します。
server {
listen 80;
server_name $MY_DOMAIN;
location / {
proxy_pass http://$APP_HOST:$APP_PORT;
}
}
この設定では、$MY_DOMAIN
, $APP_HOST
, $APP_PORT
という環境変数を使用しています。
以下のようなDockerfileを作成します。
FROM nginx:latest
COPY nginx.conf.template /etc/nginx/templates/nginx.conf.template
ここでは、envsubst
をDockerイメージ作成時に実行する仕組みが既に存在するため、特別なCMDは必要ありません。
docker-entrypointスクリプトの利用
docker-entrypoint
はDockerイメージの起動時に自動的に実行されるスクリプトです。このスクリプト内でenvsubst
を使用してNginxの設定テンプレートから実際の設定ファイルを生成します。
既に存在するdocker-entrypoint
内のスクリプトによって、環境変数がNginxの設定ファイルに反映されます。
docker-composeを使用した環境変数の設定
以下のようなcompose.yaml
ファイルを作成します。
services:
web:
build: .
environment:
MY_DOMAIN: mydomain.com
APP_HOST: apphost
APP_PORT: 8080
このcompose.yaml
を使い、compose up
コマンドで環境変数を指定してコンテナを起動することができます。
応用編: Amazon ECSのタスク定義での環境変数の設定
Amazon ECSでは、タスク定義のenvironment
セクションを使用して環境変数を設定できます。
{
"name": "web",
"image": "my-nginx-image",
"environment": [
{
"name": "MY_DOMAIN",
"value": "mydomain.com"
},
{
"name": "APP_HOST",
"value": "apphost"
},
{
"name": "APP_PORT",
"value": "8080"
}
]
}
このようにECSのタスク定義を設定することで、ECS上でのコンテナ実行時にも環境変数を活用することができます。
まとめ
DockerとNginxを組み合わせて使用する際、docker-entrypoint
とdocker-compose
を活用することで、環境変数を動的にNginxの設定に適用することが容易になります。ECSのタスク定義を使えば、クラウド環境での運用にもこの方法を応用できます。これにより、柔軟な設定変更と環境の再現性を高めることができます。