🎐

docker composeで特定コンテナの起動をオプションにする

2024/08/15に公開

チーム開発でdocker composeを使っている場合、たまにメンバーの好みでアプリケーションをDockerで動かしたい人と、ホスト環境で動かしたい人に分かれます。@zaru 個人的にはアプリケーションはホスト環境で動かすほうがメリットが強いと思いますが、場合によりけりで絶対ではないとも考えています。

当然、チームの中で開発環境は統一したほうが良いのは良いですが、Dockerかホストか選択できてもいいかなということで今回はdocker composeで特定コンテナの起動をオプションにする方法を紹介します。

Docker Composeのprofileオプション

やり方は非常にシンプルで、デフォルトで起動させない、つまり起動をオプションにしたいサービスに profiles キーを指定するだけです。

例として以下の compose.yml ファイルで説明します。

  • appdb 2つのサービスを定義
  • app には profiles[app] が指定している
compose.yml
services:
  app:
    image: node
    tty: true
    profiles: [app]

  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

この状況で docker compose up をすると起動するのは db サービスのみです。app サービスは起動しません。

# db のみ
docker compose up

profiles キーで指定されているサービスを起動するには以下のように明示的に指定をします。

# app と db 両方が起動する
docker compose --profile app up

# 環境変数でも指定可能
COMPOSE_PROFILES=app docker compose up

基本的な使い方はこれだけです。最初のDockerかホストか選択させるという状況に対しては、デフォルトはホストで動かすようにし、Dockerで動かしたい人は --profile を指定して起動すればOKという感じで対応ができます。

他の方法: compose.yml を上書きする

こちらは profile を使う方法と比較するとファイル管理が煩雑なのでオススメはしませんが、 compose.yml を上書きする機能を使っても実現できます。compose.override.yml というファイルを作成すると自動で設定を上書き(マージ)してくれます。

最初の例と同じような構成を作る場合、まず compose.yml にはDBサービスの定義だけします。

compose.yml
services:
  db:
    image: postgres
    environment:
      POSTGRES_PASSWORD: example

そして上書きする compose.override.yml にはappサービスの定義をします。

compose.override.yml
services:
  app:
    image: node
    tty: true

この状態で docker compose up すると、appとdb両方が起動します。もし、appをホストで動かしたい場合は compose.override.yml を削除したり、そもそも作成しなければ起動しなくなります。

以上のようにprofile機能を使えば柔軟なdocker compose構成が作れます。今回紹介した事例以外にもデバッグ時にだけ起動させる、データメンテナンスのときだけ起動させるなど幅広い対応が可能です。ぜひ皆さんも試してみてください。

ムーザルちゃんねる

Discussion