docker-compose が 1 つの構文ではソース ディレクトリを作成し、他の構文では作成しないのはなぜですか?

docker-compose が 1 つの構文ではソース ディレクトリを作成し、他の構文では作成しないのはなぜですか?

私のファイルにある、ボリュームマウントを設定する次のYAMLコードdocker-compose.yml(バージョン3.7を使用)を検討してください。短縮構文ドキュメントに指定されているとおり:

volumes:
    - ./logging:/var/log/cron

loggingこれにより、ホスト マシン上の相対パスが/var/log/cronコンテナー内のフォルダーにマップされます。 を実行するとdocker-compose uploggingホスト マシン上にフォルダーが存在しない場合は、Docker によって作成されます。これですべて完了です。

さて、上記を次のように変更すると長い形式の構文:

volumes:
    - type: bind
      source: ./logging
      target: /var/log/cron

を実行すると、ホストマシン上に存在しない場合はフォルダdocker-compose upが作成されません。logging

Cannot create container for service app: b'Mount denied:\nThe source path "C:/Users/riptusk331/logging"\ndoesn\'t exist and is not known to Docker'

短い形式の構文では、ホスト パスが存在しない場合にホスト パスが作成されるのに、長い形式ではホスト パスが作成されず、エラーが発生する理由を知っている人はいますか?

Windows 用 Docker Desktop の使用。

答え1

これは実際には、古い構文の「機能」(バグ)であり-v、その動作に依存して作成された何千(何百万?)もの実装がすべて壊れてしまうため、修正したくありませんでした。

Docker Swarm 用に導入され、その後、元の Docker CLI 呼び出しと互換性を持つように拡張された新しい--mountボリューム構文では、この機能は明示的に再導入されませんでした。これは、実際には文書化されておらず、依存すべきではない「予期しない魔法」であったためです。

関連情報