docker-compose up で一部のサービスを除外する方法
追記 2021/03/25: profiles
を使った方法について追記しました。
Docker 小ネタで、 docker-compose up
コマンドで一部のサービスを除外する方法についてです。
動作確認時点の Docker と Docker Compose のバージョンは次のとおりです。
docker
: 19.03.5, build 633a0eadocker-compose
: 1.25.4, build 8d51620a
docker-compose.yml
で定義されたサービスのうち一部を除外してサービスを起動する方法として、以下の 3 通りの方法があります。
- 方法 A:
docker-compose up
の引数を使う - 方法 B:
docker-compose up
の--scale
オプションを使う - 方法 C: 設定ファイルで
profiles
を使う
方法 A: docker-compose up
の引数を使う
これは次のようにして起動したいサービスを明示的にすべて指定する方法です:
# 起動したくないサービス以外をすべて引数で指定する
docker-compose up [service a] [service b] [service c] ...
この方法は起動したいサービスが 1 〜 2 つの場合はよいですが、除外したいサービスの方が少ない場合は少し不便な感じがします。
また、この方法の応用として、起動したいサービス名をファイルに記述しておいてその中身を展開して docker-compose up
に渡すというアプローチもあります:
docker-compose up $(< services.txt)
方法 B: docker-compose up
の --scale
オプションを使う
これは次のようにして --scale
オプションを使って除外したいサービスの起動数を 0 にする方法です:
# `cli` というサービスを除外して他をすべて起動する
docker-compose up --scale cli=0
ただ、この方法はあまり直感的ではないので覚えづらく、あくまでも「次善の策」という感じです。
方法 C: 設定ファイルで profiles
を使う
これは Docker Compose の設定ファイルで、通常起動しないサービスに profiles
を付けておく方法です。
docker-compose.yml
:
services:
db:
image: mariadb:10.5
adminer:
image: adminer:4-standalone
ports:
- "8080:8080"
profiles:
- extra
ここでは db
と adminer
という 2 つのサービスを定義していて、 adminer
の方には profiles
を設定しています。
こうしておくと、オプションを付けずにそのまま docker-compose up
をした場合は adminer
サービスは起動しません:
# `profiles` の設定されていないサービスだけが立ち上がる
# 上の場合は `db` のみ
docker-compose up -d
--profile
オプションを付けて実行すると adminer
も起動します:
# 以下の 2 種類のサービスが起動する:
# 1. `profiles` の設定されていないもの
# 2. `profiles` に `extra` が含まれるもの
docker-compose --profile extra up -d
--profile
を付けて起動したものを停止・削除したいときは、同様に --profile
をつければ OK です:
docker-compose --profile extra down
ということで、 --profile
使う場面がかぎられるサービスは profiles
を付けて定義しておくのがよさそうです。
個人的には、 A の方法はあまり便利ではないので、 B と C をそのときどきで使い分けています。
参考: