1. ホーム
  2. docker

[解決済み] Dockerにマウントされたボリュームは、Linuxスタイルのパスから変換する際にWindowsパスの最後に;Cを追加します。

2022-11-16 08:43:52

質問

WindowsでDockerイメージをマウントしようとしたところ、いくつかの興味深い奇妙なことがわかりました。

私は .sh スクリプトを作成し、開発者環境イメージを実行するためにプロジェクト フォルダをマウントしています。マシンに関係なく、すべての開発者が実行できる 1 つのスクリプトが必要です。このスクリプトが行うのは、現在のプロジェクト フォルダで docker を実行するだけです。

#!/usr/bin/env bash
docker run -it --rm -v D:\my\project\folder:/wkDir $IMAGE_TAG yarn dev

問題なく実行されました。さて、計画では、このスクリプトを npm から呼び出す予定なので、現在のフォルダーに対して相対的に動作するようにしたいと思います。別のバージョンを試してみましょう。

docker run -it --rm -v $PWD:/wkDir $IMAGE_TAG yarn dev

で失敗。

C:\Program Files\Docker\Docker\Resources\bin\docker.exe: Error response from 
daemon: Mount denied:
The source path "D:/my/project/folder;C"
doesn't exist and is not known to Docker.

ワット What's ;C とは、どこから来たのでしょうか?

ということで、私は echo $PWD とすると /d/my/project/folder .

興味深いことに、それで $PWD はlinuxのパスフォーマットで正しいパスに解決され、dockerはそれを正しいwindowsのパスに変換しようとしているようですが、これ以外に ;C がどこからともなく表示されます。そして \/ ...

いったい何が起こっているのでしょうか?

VSCodeのターミナルgit bashとpowershellで同じ結果になります。

更新:気づいたのですが .sh を実行すると、VSCode のパワーシェル・ターミナルで、別の cmd.exe というコンソールウィンドウが開き、git bashでスクリプトが実行されるようです。ということで、これはgit bashの問題なのかもしれません。

どのように解決するのですか?

git-bash が docker のマウントを失敗させることに関連する、以下の 3 つのスレッドを見つけました。

https://forums.docker.com/t/weird-error-under-git-bash-msys-solved/9210 https://github.com/moby/moby/issues/24029#issuecomment-250412919

git-bashが使っているパス変換についてmingwのドキュメントを調べると、このような構文の表があります。 http://www.mingw.org/wiki/Posix_path_conversion

という形式で出力するものがあります。 x;x;C:\MinGW\msys\1.0\x . なお ;C に注目してください。もしgit-bashが賢くなろうとして構文を詰め込み、このようなフォーマットでパスを出力しているのであれば、これで説明がつくでしょう。

解決策としては、パスの変換をエスケープするために、プレフィックスとして / . というわけで、現在の作業ディレクトリでgit-bashからdockerを実行する作業用dockerコマンドです。

docker run -it --rm -v /${PWD}:/wkDir $IMAGE_TAG yarn dev