2行で頼む
- Docker Compose CLIは
docker-compose.yml
が見つかるまで親ディレクトリを駆け上がって探索する - この仕様を利用すると、monorepo開発が便利になる
ドキュメント
https://docs.docker.com/compose/reference/
-f
フラグの説明に以下のように書いてある。
Compose traverses the working directory and its parent directories looking for a docker-compose.yml and a docker-compose.override.yml file
「Composeはワーキングディレクトリとその親ディレクトリを探索して、docker-compose.yml
とdocker-compose.override.yml
を探す」と書いてある。
parent directories
なので、1個上のディレクトリになかったら、さらにその1つ上のディレクトリを探す。
この仕様は compose-goのWithDefaultConfigPath
関数に実装されている。
ドキュメントの履歴
https://github.com/docker/docker.github.io/commits/master/compose/reference/index.md
2016年のコミットが一番古いが、この時点で上記文章は存在する。 よく使っているのに今まで知らなかった…。
monorepoの開発で利用する
この仕様に気づいたのは、monorepoで開発をしている時だった。
以下のような構成で、レポジトリルートに全てのサービスを結合するdocker-compose.yml
がある。
<monorepo-root>
|-- docker-compose.yml
|
|-- service1
| |-- Dockerfile
| |-- Gemfile
| ...
|
|-- service2
| |-- Dockerfile
| |-- package.json
| ...
version: "3"
services:
service1:
image:
build: ./service1
service2:
build: ./service2
service1 を開発する時は service1 ディレクトリにcd
する。
cd
した先にdocker-compose.yml
が無ければ、レポジトリルートのdocker-compose.yml
を使うことが出来る。
$ cd service1
$ docker compose up service1
$ docker compose exec bin/rails test test/system/top_test.rb # パス補完も効く
おわりに
あけましておめでとうございます。