docker composeで特定コンテナの起動をオプションにする
チーム開発でdocker composeを使っている場合、たまにメンバーの好みでアプリケーションをDockerで動かしたい人と、ホスト環境で動かしたい人に分かれます。@zaru 個人的にはアプリケーションはホスト環境で動かすほうがメリットが強いと思いますが、場合によりけりで絶対ではないとも考えています。
当然、チームの中で開発環境は統一したほうが良いのは良いですが、Dockerかホストか選択できてもいいかなということで今回はdocker composeで特定コンテナの起動をオプションにする方法を紹介します。
Docker Composeのprofileオプション
やり方は非常にシンプルで、デフォルトで起動させない、つまり起動をオプションにしたいサービスに profiles
キーを指定するだけです。
例として以下の compose.yml
ファイルで説明します。
-
app
とdb
2つのサービスを定義 -
app
にはprofiles
で[app]
が指定している
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サービスの定義だけします。
services:
db:
image: postgres
environment:
POSTGRES_PASSWORD: example
そして上書きする compose.override.yml
にはappサービスの定義をします。
services:
app:
image: node
tty: true
この状態で docker compose up
すると、appとdb両方が起動します。もし、appをホストで動かしたい場合は compose.override.yml
を削除したり、そもそも作成しなければ起動しなくなります。
以上のようにprofile機能を使えば柔軟なdocker compose構成が作れます。今回紹介した事例以外にもデバッグ時にだけ起動させる、データメンテナンスのときだけ起動させるなど幅広い対応が可能です。ぜひ皆さんも試してみてください。
Discussion