zukucode
主にWEB関連の情報を技術メモとして発信しています。

docker-compose.ymlでポートを開発環境と本番環境で切り替える

docker-compose.ymlでポートを開発環境と本番環境で切り替える方法を紹介します。

例えば、本番環境ではポートを80で使用するが、開発環境では別のポート(8080など)を使用したい場合があります。

docker-compose.ymlの設定を開発環境と本番環境で切り替えるで、開発環境と本番環境を切り替える方法を紹介しましたが、ポートについては注意が必要です。

例えば、以下のように設定してもうまく行きません。

docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    ports: 
      - 80:80
docker-compose.dev.yml
version: '3'
services:
  web:
    ports: 
      - 8080:80
$ docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

原因

-fオプションで指定したファイルの設定は基本的には上書きでマージされますが、ポートについては、複数の設定が可能なので、以下のマージ結果になります。

docker-compose.yml(マージ結果)
version: '3'
services:
  web:
    image: nginx
    ports: 
      - 80:80
      - 8080:80

ポート808080が両方設定されてしまいます。

対処法

docker-compose.override.ymlという名前でファイルを作成します。

この名前のファイルは-fオプションを指定せずに実行した場合に、自動で読み込まれてマージされます。

つまり、本番環境で実行した場合に読み込まれる設定内容をここに記載します。

docker-compose.override.yml
version: '3'
services:
  web:
    ports:
      - 80:80

共通の設定ファイルからポートの指定を削除します。

docker-compose.yml
version: '3'
services:
  web:
    image: nginx
    ports: 
      - 80:80

開発環境で使用したいポートはここに設定します。

docker-compose.dev.yml
version: '3'
services:
  web:
    ports: 
      - 8080:80

以下のコマンドで切り替えることにより、開発環境では8080、本番環境ではdocker-compose.override.ymlが読み込まれるため、80のポートが設定されることになります。

$ docker-compose -f docker-compose.yml -f docker-compose.dev.yml up #開発環境
$ docker-compose up #本番環境(docker-compose.override.ymlが読み込まれる)

関連記事