はじめに
例として、ローカル開発環境でdocker-compose.ymlを以下のように定義しているとしましょう。
services:
db:
...
web:
...
app:
...
scheduler:
...
この内schedulerサービスはバッチ処理用のサービスで、ローカル開発時に起動させたくないものと考えてください。しかし、docker compose upして各種サービスを起動しようとすると、定義してあるすべてのサービスが起動してしまいます。
このように「特定のサービス(今回でいうとschedulerサービス)のみ、起動させたくない」といった場合、様々な手段がありそうですが、今回は3選に絞って紹介いたします。おすすめは後述する方法3の「profilesを利用する」になります。
また、本記事の内容は、特定のサービスに関して普段は起動させたくないが、使う時もあるからその時は何かコマンドで明示的に指定することで起動できるようにしておきたい!といったユースケースに対応する方法となります。
方法1 docker-compose.ymlを分ける
まず、docker compose up時に起動させたくないサービスを除外したdocker-compose.ymlを準備します。
services:
db:
...
web:
...
app:
...
次に、普段は起動させたくないけど必要になったら起動したいサービス(schedulerサービス)を定義に含めたdocker-compose-all.ymlを準備します。
services:
db:
...
web:
...
app:
...
scheduler:
...
これで、普段はschedulerサービスを除いたサービス群を起動したい場合はdocker compose upする形となり、schedulerサービスを含めてサービスを起動させたい場合は、docker compose -f docker-compose-all.yml upのように起動させてあげればOKになります。
方法1の所感
ただし、こちらの方法はファイルを分けたことで、なんらかの修正が発生した際に、2ファイルの修正が必要になったりする点と、docker-compose-all.ymlの方が忘れ去られて修正漏れが発生したりと運用・管理面で微妙でした。
方法2 Makefileを利用する
次にMakefileを利用した方法を紹介します。
以下のようなMakefileを準備してdocker-compose.ymlと同階層に配置します。
up:
docker compose up -d db web app
up-all:
docker compose up -d db web app scheduler
このようにMakefileを活用することで
普段schedulerサービスを使いたくない場合は、make upを実行してschedulerサービスを除いたサービス群を起動させます。また、schedulerサービスを利用したい場合は、make up-allを実行して対応することができます。
方法2の所感
こちらも管理するファイルが1つ増えるため、docker-compose.ymlにサービスを追加したりした際に、Makefileも修正が必要になることが多々あり、ちょっと微妙な感じがしました。
また、Makefileを利用した形に寄せようとすると、必然的にdocker compose buildやdocker compose stop、docker compose exec、docker compose down用の定義がいるよねとなり、結果的に定義する内容が意外と多くなってしまう印象です。
方法3 profilesを利用する(おすすめ)
まず、以下のようにprofilesを追加します。
services:
db:
...
web:
...
app:
...
scheduler:
profiles: ["scheduler"]# ←ここを追加するだけ!
...
profiles:を追加することで、docker compose up時などに当該サービスが起動対象から除外されます。これはbuild時も同様に対象から除外されます。
逆にschedulerサービスを起動したい場合は、profiles: ["ラベル名"]とありますが、ラベル名の部分を利用して、docker compose --profile ラベル名 upとすればprofilesを設定しているサービスを含めて起動させることが可能です。
そのため、普段はdocker compose upを行ってprofilesを設定したサービス(schedulerサービス)を起動させずに各種サービス群を起動して利用することができますし、何か特別な事情でschedulerサービスを利用したい場合は、docker compose --profile scheduler upとすればschedulerサービスを含めたすべてのサービスを起動させることができるようになります。
方法3の所感
管理するファイルを増やすことなく、make hogeといった別途コマンドを把握・管理する必要もなく、仮に使いたい時も--profileを指定してビルドや起動を行えば良いので、この方法が一番おすすめでした。
profilesに関する補足
今回は特に問題ありませんが、depends_onで指定されたサービスに対してprofilesを設定した場合は、同じprofilesを依存関係にあるサービスにも設定する必要が発生する点を押さえておきましょう。詳細はこちら
最後に
profiles便利ですね、最後まで見ていただきありがとうございます!