版權所有,轉載請注明出處。
准備工作
在windows的user文件夾下新建文件夾,命名為DockerPackages,這個就是我們想掛載的文件夾。
錯誤重現
測試環境:
docker 版本: 18.09.0
windows 版本:win10,用HyperV
命令行工具:git-bash git version 2.19.1.windows.1
使用下列方式mount volume,會出現問題
-
使用HOME
winpty docker run -itv ~/DockerPackages:/mnt/packages centos:7
獲得如下錯誤:
C:/Program Files/Docker/Docker/Resources/bin/docker.exe: Error response from daemon: Mount denied:
The source path "C:/Users/cb/DockerPackages;C" doesn't exist and is not known to Docker.
See 'C:/Program Files/Docker/Docker/Resources/bin/docker.exe run --help'.看上去貌似windows下文件路徑沒有被准確識別,我們試試看絕對路徑。
-
試試看絕對路徑
winpty docker run -itv /c/Users/cb/DockerPackages:/mnt/packages centos:7
獲得如下錯誤:
C:/Program Files/Docker/Docker/Resources/bin/docker.exe: Error response from daemon: Mount denied:
The source path "C:/Users/cb/DockerPackages;C"
doesn't exist and is not known to Docker.
See 'C:/Program Files/Docker/Docker/Resources/bin/docker.exe run --help'.
錯誤看上去差不多,文件路徑識別的問題。windows下linux工具的使用,路徑一直就是個問題。
錯誤分析
既然是在git bash下使用linux命令,而正常的~/或者/C/folderPath/不能正確運行。眼尖的朋友們可能已經看出端倪了:source path是C:/Users/cb/DockerPackages;C。這個;C在末尾是什么?我們的輸入不是這樣的不是么?
google一下,stackoverflow也有人提出了類似問題:
Docker mounted volume adds ;C to end of windows path when translating from linux style path
有興趣可以自己看一下。大意就是,MinGW會把MSYS program的參數自動轉換成Window programm,注意其中的一條:
x:❌/x x;x;C:\MinGW\msys\1.0\x
這條看上去有些可疑,因為我們也用了類似的寫法 :/mnt
解決錯誤
既然是git-bash嘗試補全造成的問題,那就想辦法不要補齊或者強制轉義。stackoverflow的高分解答表示,在path前加/可以實現跳過path的書寫轉義規定。那我們來試試看。
錯誤重現中的第二點,也是用/開始的,顯然不對。那我們在前面再加一個/
winpty docker run -itv //c/Users/cb/DockerPackages:/mnt/packages centos:7
問題解決。這個方案我個人感覺是最好的。
試試別的解決方案
綜合了Posix path conversion以及stackoverflow的答案,嘗試以下的方案也是可以的:
winpty docker run -itv "/C:/Users/cb/DockerPackages":/mnt/packages centos:7
winpty docker run -i -t -v "/C:\users\cb\DockerPackages":/mnt/packages centos:7
winpty docker run -i -t -v "C:\users\cb\DockerPackages":/mnt/packages centos:7
由此看來,開頭是不是用/不是很重要。而""是必須的。暫時沒有找到可以使用~的方案,如果有,請留言告訴我。
其次,在windows下使用路徑,在寫:/的時候要非常慎重,這個會被補全或者轉義,務必在最前面加上/。