【原】Docker 排坑之旅(一):windows下不能掛載文件夾進container


版權所有,轉載請注明出處。

准備工作

在windows的user文件夾下新建文件夾,命名為DockerPackages,這個就是我們想掛載的文件夾。

錯誤重現

測試環境:

docker 版本: 18.09.0
windows 版本:win10,用HyperV
命令行工具:git-bash git version 2.19.1.windows.1

使用下列方式mount volume,會出現問題

  1. 使用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下文件路徑沒有被准確識別,我們試試看絕對路徑。

  2. 試試看絕對路徑

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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM