Open1
Git Worktreeでdocker composeを実行すると.gitのエラー

Git Worktreeでaddしたプロジェクトでdocker compose upを実行すると以下のエラーが発生した。
Error response from daemon: failed to create task for container: failed to create shim task: OCI runtime create failed: runc create failed: unable to start container process: error during container init: error mounting "/var/lib/docker/volumes/project-feature-task1_web-git/_data" to rootfs at "/var/www/project/.git": mount /var/lib/docker/volumes/project-feature-task1_web-git/_data:/var/www/project/.git (via /proc/self/fd/7), flags: 0x5000: not a directory: unknown: Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type
原因
Git Worktreeでは、.gitはディレクトリではなく、メインリポジトリの.gitディレクトリを指すテキストファイルに変換される。
cat .git
gitdir: /Users/user/projects/project/.git/worktrees/project-feature-task1
Dockerは.gitをディレクトリとしてマウントしようとするが、実際にはファイルなので失敗している。
解決策
docker-compose.yml で、web-gitのボリューム定義を削除する
--- a/docker-compose.yml
+++ b/docker-compose.yml
@@ -12,7 +12,6 @@ services:
- web-bundle:/usr/local/bundle
- web-log:/var/www/MemoriaWeb/log
- web-tmp:/var/www/MemoriaWeb/tmp
- - web-git:/var/www/MemoriaWeb/.git
ports:
- 7001:3000
depends_on:
@@ -41,4 +40,3 @@ volumes:
web-log:
web-tmp:
web-bundle:
- web-git:
そもそも、どうして.gitがdocker-compose.ymlでボリュームとして独立していたかというと、Docker for Mac(特に古いバージョン)では、ホストとコンテナ間のファイル同期が遅いという問題があって、.gitディレクトリは大量の小さなファイルを含むため、別のボリュームとして分離することでパフォーマンスを向上させようとしていた。
同じタイミングのコミットとしては以下もある。
volumes:
...
- web-bundle:/usr/local/bundle
- web-log:/var/www/project/log
- web-tmp:/var/www/project/tmp
しかし、いまだったら速度の低下のデメリットよりもGit Worktreeを使えるメリットの方が大きいのでweb-gitのボリューム定義を削除してOKとする。