Docker

【Docker】docker-compose.ymlの設定を開発環境と本番環境に分ける方法

Docker

 

今回はdocker-compose.ymlの設定を開発環境と本番環境に切り分ける方法について備忘録としてまとめたいと思います。

開発環境では分析ツールやテスト等の様々なイメージが入っているためボリュームが大きくなってしまいがちですが、本番環境では最小限のパッケージが入っていれば済む場合が多いと思います(プロダクトによりますが)。そういった場合はdocker-compose.ymlの設定を開発環境と本番環境で分けることで効率化を図ることができます。

前提

現在以下のようなdocker-compose.ymlがあると仮定します。あくまでこちらの内容は例のため、部分的に切り出しています。

version: '3.8'

services:
  web:
    image: circleci/ruby:3.0.1-node-browsers
    ports:
      - "${WEB_PORT:-3000}:3000"

  node:
    image: node
    ports: 
      - 3000:3000

開発環境と本番環境に切り分ける

開発環境での設定と本番環境での設定を分けるには、まずはdocker-compose.dev.ymlをdocker-compose.ymlと並列になるように作成します。

docker
  - docker-compose.yml # 本番環境用
  - docker-compose.dev.yml # 開発環境用
docker-compose.ymlが本番環境用、docker-compose.dev.ymlが開発環境用ファイルになります。

 

今回はnodeコンテナを開発環境では使用しないと仮定します。

作成したdocker-compose.dev.ymlにnodeコンテナ部分を切り出しましょう。

version: '3.8'

services:
  node:
    image: node
    ports: 
      - 3000:3000

 

nodeコンテナが切り出された後のdocker-compose.ymlは以下のようになります。

version: '3.8'

services:
  web:
    image: circleci/ruby:3.0.1-node-browsers
    ports:
      - "${WEB_PORT:-3000}:3000"

 

これで開発環境用と本番環境用で設定ファイルを分けることができました。

コンテナの起動

開発環境

開発環境では複数のdocker-compose.ymlを読み込む必要があるため、コンテナを起動する際は以下のコマンドを打ち込みます。後に記載した内容(今回で言うdocker-compose.dev.yml)が先に記載した内容(今回で言うdocker-compose.yml)にマージされることになります。

% docker-compose -f docker-compose.yml -f docker-compose.dev.yml build
% docker-compose -f docker-compose.yml -f docker-compose.dev.yml up -d

 

一度上記コマンドのコマンドでbuildした場合、以降は以下のコマンドで起動が可能です。

% docker-compose -f docker-compose.yml -f docker-compose.dev.yml up

本番環境

本番環境のコンテナを起動したい場合は、以下のコマンドで起動が可能です。

% docker-compose up

まとめ

  • 開発環境の設定はdocker-compose.dev.ymlに、本番環境用の設定はdocker-compose.ymlに記載する
  • 開発環境のコンテナ起動コマンドは「docker-compose -f docker-compose.yml -f docker-compose.dev.yml up」
  • 本番環境のコンテナ起動コマンドは「docker-compose up」

 

 

今回はdocker-compose.ymlの設定を開発環境と本番環境で分ける方法についてまとめました。ステージング環境の設定ファイルも別にしたい場合は「docker-compose.dev.yml」「docker-compose.stg.yml」「docker-compose.prod.yml」の3つを作成すれば良さそうですね。

COMMENT

メールアドレスが公開されることはありません。 * が付いている欄は必須項目です