docker-compose.ymlはプロジェクトRoot直下に置くか、Dir名を工夫しよう

2022.01.11

この記事は公開されてから1年以上経過しています。情報が古い可能性がありますので、ご注意ください。

プロジェクトのRoot直下は、ともすればいろんなメタファイルで汚れがち。整理整頓、ディレクトリに分けて関係あるのをまとめて、、と皆さんされる事と思いますが、そこで気を付けたいのが掲題の話です。

はい、ご存じの方は今更何を、、な内容ですが、Docker Composeのプロジェクト管理の話ですね。

Docker Composeには独自のプロジェクトの概念があり、デフォルトではymlが置かれたカレントディレクトリがプロジェクト名とされます。つまり

project-root/
  local-dev/
    docker-compose.yml
    mysql/
      init.sql
      :

このようにして docker-compose.yml 等をサブディレクトリにまとめて置いてたりすると、プロジェクト名=local-dev という良く分からないものになってしまいます。
分からないだけなら良いですが、別の開発案件でも同様の配置にすると、全く別の案件なのに Docker Compose的には同じプロジェクトとして認識されてしまう事になります。 これはアカンやつですね。

という事で掲題にあるように

  • docker-compose.yml だけはRoot直下に置く
  • ディレクトリ名に、案件横断してユニークな名前を付ける

のいずれかをするのが良いと思います。
なおプロジェクト名は docker-compose up の際に引数で指定する事が可能ですので、それを忘れずにやれるという事であればそれでもOKかもしれません(私は忘れる自信があります)。

おまけ

以下はあまり詳細には調査・考察してません。誤りや漏れがあったらゴメンナサイ。

プロジェクトが一緒で何が困る?

例えば2つの案件でそれぞれ mysql を使っている場合、

prj1/local-dev

services:
   mysql
     image: mysql:5.7

prj2/local-dev

services:
   mysql
     image: mysql:5.7

案件①で作成したmysqlコンテナがあると、案件②でdocker-compose upしても既にコンテナがあるので作成されずに再利用されます*。この場合、案件②側で用意してるInitスクリプトが走らなったり、設定がズレてたりして、期待した状況にならないという事が考えられます。

*サービス名が同じ場合

まぁ力押し 案件①側 docker-compose down → 案件②側で up すれば大抵はどうにかなるのですが、、頻繁に両者を行き来するような状況だと、面倒な状況を生むリスクが高まるでしょう。
加えて環境依存なので「他の人は大丈夫なのに自分だけ上手く行かない」という哀しい目を見ることも。。。

コンテナ名を指定する意味ある?

コンテナ名が異なっていても、プロジェクト+サービス名 が同一であれば、同じコンテナと認識されるようです。
ここでも注意点としては、コンテナ名はプロジェクト横断でユニークとなる必要があります。 つまり明示する場合は、プロジェクト名+サービス名を含むいわゆる完全修飾名を付けないと、他案件のそれとバッティングする可能性があるので注意しましょう。