Docker 排坑之旅(一):windows下不能掛載資料夾進container
準備工作
在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;www.quwanyule157.com 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;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:www.michenggw.com /Users/cb/DockerPackages":/mnt/packages centos:7
方法二
winpty docker run -i -t -v "/C:www.yigouyule2.cn \users\bin.chen\DockerPackages":/mnt/packages centos:7
方法三
winpty docker run -i -t -v "C:\users\bin.www.mingcheng178.com chen\DockerPackages":/mnt/packages centos:7
由此看來,開頭是不是用/不是很重要。而""是必須的。暫時沒有找到可以使用~的方案,如果有,請留言告訴我。
其次,在windows下使用路徑,在寫:/的時候要非常慎重,這個會被補全或者轉義,務必在最前面加上/。