docker-compose up で一部のサービスを除外する方法

Docker

追記 2021/03/25: profiles を使った方法について追記しました。

Docker 小ネタで、 docker-compose up コマンドで一部のサービスを除外する方法についてです。 動作確認時点の Docker と Docker Compose のバージョンは次のとおりです。

  • docker: 19.03.5, build 633a0ea
  • docker-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

ここでは dbadminer という 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 をそのときどきで使い分けています。

参考:


アバター
後藤隼人 ( ごとうはやと )

Python や PHP を使ってソフトウェア開発やウェブ制作をしています。詳しくはこちら