Help us understand the problem. What is going on with this article?

V3以降はdocker-compose.ymlで外部ファイルを参照出来ない!

YAML include等と検索した所、
RubyやPython等の言語独自の仕様が死ぬほど出てきて死んだので備忘録として書き残す

そもそもどういうことなの?

そもそものYAMLには外部ファイルを参照するという仕様はないらしく、
外部ファイルを参照したければYAMLを実装している各種ライブラリが独自実装する形になるようだ。
(この辺ちゃんと確認した訳ではないので、誤ってたら教えてください)

例えばSymfonyというPHPフレームワークが採用しているYAMLでは、ファイルの上部にimportsというおまじないを記載することで外部ファイルの設定を利用できる。
もちろん他の言語やライブラリにはそういう仕組は用意されていないので、Symfonyと同じやり方をRubyのライブラリでやろうとしてもうまくいかないだろう。

検索する時も同様でYAML include等のワードで検索することは時間の無駄で、
例えばdocker-compose.ymlで外部ファイル参照がしたければ、docker-compose.yml 外部ファイルという風に採用している言語や技術等のワードを含めた形で検索しなければならない。

docker-compose.ymlで外部ファイルを参照する方法(V2まで)

※以下の方法はV2までのファイルフォーマットであり、
V3からはフラットな構築にしなさいというありがたいお言葉と共に取り除かれてしまった。

偉大なる公式サイト: サービスの拡張 - Docker Compose

Docker Compose の extends (拡張)キーワードは、異なったファイル間で設定を共有できるだけでなく、異なったプロジェクトでも利用可能です。拡張サービスは複数のサービスを持っている場合、一般的な設定オプションの再利用に便利です。 extends を使えば、1箇所だけでなく、どこでも利用可能なサービス・オプションの共通セットを定義できます。

docker-compose.yml

extendsキーで外部ファイルを指定し、サービス名をキーにまるごとテンプレートとしてまるごと持ってくる。
その後、コンテナの用途に合わせてプロパティを上書き指定していく形になる。

web:
  extends:
    file: common-services.yml
    service: webapp
  ports:
    - "4000:8080"

common-services.yml

webapp:
  build: .
  ports:
    - "8000:8000"
  volumes:
    - "/data"

本題: V3のdocker-compose.yml

アップグレードガイドを確認した所、こんな風に書いてある。

extends: This option has been removed for version: "3.x" Compose files. (For more information, see Extending services.)

実際にV3で使おうと思ったら、こんなエラーが出まくりで動く気配がない。

$ docker-compose ps
ERROR: The Compose file './docker-compose.yml' is invalid because:
Unsupported config option for services.db: 'extends'

V2にしようと思ってdocker-compose.ymlの先頭行をservice: "2"にしても、
参照元のファイルがV3準拠なので「お前V3のdocker-composeを参照しようとしてるだろ!小手先の事をしてもダメだぞ!」と叱られてしまう。

V3で無くなったextendsに関しては復活の可能性をこのIssueで議論していますみたいなリンクが張ってあった。
Add support for extends feature in Compose v3 / docker stack deploy #31101

ざっとIssueを流し読みしたところ、
extendsはそもそもバギーだし、依存関係含めると中々対応が難しいという問題があった。
それでV3で削除してフラットなデータ構造にしてねという対応にしたが、
受け皿がない、コピペだらけになるだろ、もうハックしてdocker-compose.ymlを自動生成するスクリプト作ったわという感じで荒れに荒れている。

因みにこの辺の仕様を公式のドキュメントで見ようとすると、
「削除されました」というワードにたどり着くだけで散々たらい回しにされてしまう。

Not only this, but the changelog says "this has been removed, see 'how to upgrade' for details". I look at "how to upgrade" for, you know, details on how to upgrade, and what that says is "see 'extending services' for details". I go to "extending services" figuring I'll finally see a way to extend my files, only to see "this has been removed, see the changelog for details".

At this point, this seems like a cruel joke the documentation writer is playing.

意訳: V3で削除されたので、V2からのアップデートに追従するにはAをご覧ください、Aに行くとBをご覧ください、そして最後にはAをご覧くださいに戻る。こんな下らん言葉遊びをドキュメントに書くな。

DockerComposeの拡張フィールド使う案が2018/8に出ているが、これは本格的な実装はまだまだ先っぽい?

今同じことがやりたいなら、docker-compose.ymlファイルを全てV2相当まで落とすか、
自分でスクリプトを作って自動的に生成する手段を取るしかなさそう。

Why do not you register as a user and use Qiita more conveniently?
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away
Comments
Sign up for free and join this conversation.
If you already have a Qiita account
Why do not you register as a user and use Qiita more conveniently?
You need to log in to use this function. Qiita can be used more conveniently after logging in.
You seem to be reading articles frequently this month. Qiita can be used more conveniently after logging in.
  1. We will deliver articles that match you
    By following users and tags, you can catch up information on technical fields that you are interested in as a whole
  2. you can read useful information later efficiently
    By "stocking" the articles you like, you can search right away