Windows/Mac OS X下的docker是運行在一個Linux虛擬機的, 在這個虛擬機裏,運行多個容器。三層啊,真不爽,什麼事兒都是隔山跨水的,如今事兒就來了,容器裏會報錯說找不到被映射過來的文件。docker
拿Windows舉例,有個目錄叫作 C:¥WinTestDir,放了幾個文件,如今運行一個容器例如busybox,試圖把這個目錄映射到容器裏的 /xxx/yyy目錄下,不管以C:¥WinTestDir仍是/c/WindowsDir仍是/WindowsDir都沒有效果。bash
docker run -it -v C:¥WinTestDir:/xxx/yyy busybox 結果會提示說"和:非法字符。 docker run -it -v /WinTestDir:/xxx/yyy busybox docker run -it -v /c/WinTestDir:/xxx/yyy busybox 結果容器裏的/xxx/yyy目錄下是空的。
這時通常都會意識到,這個冒號左邊的目錄實際上得是那個虛擬機裏存在的目錄才行,那麼哪些目錄被映射到虛擬機裏了呢?Docker的文檔裏寫了,composer
Windows系統:C:¥Users -> /c/Usersssh
Mac OS X系統:/Users -> /Userscode
其它的目錄壓根沒被映射進去,跟別提以後往容器裏映射了。文檔
docker-machine ssh default docker@rethink:~$ ls /c Users docker@rethink:~$ ls /c/Users/Administrator ... Documents Downloads ... docker@rethink:~$ ls /WinTestDir No such file or directory
總之,除非用VirtualBox修改這個虛擬機的共享目錄設定,不然在虛擬機裏只能看到C:¥Users如下的文件。虛擬機
因此,省事兒的方法就是把WinTestDir挪到C:¥Users下隨便一層目錄,例如it
C:¥Users¥q¥Documents¥WinTestDir,而後就能夠用io
/c/Users/q/Documents/WinTestDir來作映射源目錄了。例如docker-compose
docker run -it -v /c/Users/q/Documents/WinTestDir:/xxx/yyy busybox / # ls /xxx/yyy ... some files ...
這就OK了。
同理,docker-composer所使用的docker-composer.yml文件裏關於目錄映射(volumns)的地方就得當心。例如這裏寫的someHostDir。
test: image: busybox command: /bin/find /xxx/yyy volumes: - ./someHostDir:/xxx/yyy
看起來./someHostDir用的是相對目錄,挺優美的樣子,但是若是這個目錄不屬於C:¥Users底下的,例如C:/work,那就實際上沒法映射了。能夠用這個config子命令來看看實際目錄。Windows下就變成了/c/work/someHostDir了,實際在虛擬機裏這個目錄是和Windows機器裏的目錄沒有關聯起來,就是說是空的。
暫時離開了Windows,就用Mac OS X作實驗:
例如當前位於 /private/tmp/docker-compose-test目錄下,結果是這樣
$ docker-compose config networks: {} services: test: command: /bin/find /xxx/yyy image: busybox network_mode: bridge volumes: - /private/tmp/docker-compose-test/someHostDir:/xxx/yyy:rw version: '2.0' volumes: {}
那麼運行docker-compose up會顯示出/xxx/yyy裏的內容,什麼都沒有。
$ docker-compose up Recreating dockercomposetest_test_1 Attaching to dockercomposetest_test_1 test_1 | /xxx/yyy dockercomposetest_test_1 exited with code 0