結論
ポートフォワーディング設定については本番環境用ymlを用意しても上書きではなく追加になってしまうから、開発/本番で環境変数を変えるなどしてポート設定をした方が良さそうだ。
それかdocker-compose.ymlでポートを開発環境と本番環境で切り替えるにあるような方法でやると良い(記事を書いてからこのサイトに気づいた)
試したこと
docker-composeを使うときに開発環境と本番環境で設定を変える方法として、上書きというのがあったのでやってみた。
Compose をプロダクションで使う
- 開発用:
docker-compose.yml
- 本番用(変更点のみ):
production.yml
としておき、
$ docker-compose -f docker-compose.yml -f production.yml up
とすれば、production.ymlで上書きして実行してくれるらしい。試しに以下のような設定でやってみた。
docker-compose.yml
version: '3'
services:
db:
image: postgres
environment:
- POSTGRES_DB=postgres
- POSTGRES_USER=postgres
- POSTGRES_PASSWORD=postgres
web:
build: .
volumes:
- .:/code
- ./logs:/var/log/app
ports:
- "8081:80"
depends_on:
- db
production.yml
version: '3'
services:
db:
restart: always
web:
restart: always
ports:
- "80:80"
期待として本番環境では
- 自動起動が設定される
- ポートが8081ではなく80番になる
というもの。これで-f docker-compose.yml -f production.yml
というオプションで実行してみると、確かに自動起動設定が反映された。
しかしポートについては、上書きではなく8081番と80番の両方のポートでアクセスできるようになってしまった。portsについては上書きではなく「追加」とみなされるらしい。つまり、
ports:
- "8081:80"
- "80:80"
となるようだ。ポート設定についてはこの方法ではなく、環境変数を使うようにしておいて、開発環境と本番環境で値を変えるという方法の方が良さそうだ。