1. 程式人生 > >Docker 排坑之旅(一):windows下不能掛載資料夾進container

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下使用路徑,在寫:/的時候要非常慎重,這個會被補全或者轉義,務必在最前面加上/。