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とする。