[解決済み] Dockerにマウントされたボリュームは、Linuxスタイルのパスから変換する際にWindowsパスの最後に;Cを追加します。
質問
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
関連
-
[解決済み】Windows 10のDockerでカレントディレクトリをボリュームとしてマウントする。
-
[解決済み】サービス開始後にDockerコンテナを起動し続けるには?
-
[解決済み] docker イメージの sha256 コードはどこで確認できますか?
-
[解決済み] Docker HostへのポートのみのEXPOSE
-
[解決済み] Kubernetesのローカル開発環境を構築する方法とは?
-
[解決済み] Dockerfileに複数行のコマンドを改行を維持したまま記述する方法とは?
-
[解決済み] Dockerの実行と作成
-
[解決済み] Linuxでdockerを停止する方法
-
[解決済み] docker-compose build` と `docker build` の違いは何ですか?
-
[解決済み] docker execで2つのコマンドを実行する方法
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み】Windows 10のDockerでカレントディレクトリをボリュームとしてマウントする。
-
[解決済み] docker イメージの sha256 コードはどこで確認できますか?
-
[解決済み] docker login unknown shortorthand flag: 'e'
-
[解決済み] Docker HostへのポートのみのEXPOSE
-
[解決済み] Dockerのデタッチドモード
-
[解決済み] Docker-compose マウントされたボリュームにユーザーとグループを設定する
-
[解決済み] コンテナ上でローカルファイルを使用するには?
-
[解決済み] DC/OS上のDockerコンテナにおけるMarathonとKubernetesとDocker Swarmの比較
-
[解決済み] dockerコンテナにroot以外のユーザーで接続する
-
[解決済み] docker-compose Version 3 の conditions form の depends_on に代わるものは何ですか?