docker volume 可使咱們在啓動docker容器時,動態的掛載一些文件(如配置文件), 以覆蓋鏡像中原有的文件,可是,掛載一個主機上尚不存在的文件夾或者文件到容器中會怎樣呢?LZ在工做中就遇到了這樣的問題,故本身實踐了一下,記錄實驗結果以下:docker
docker在文件夾掛載上的行爲是統一的,具體表現爲:segmentfault
docker run -v /path-to-folder/A:/path-to-folder/B test-image
詳細說明以下:bash
host | container | mount result |
---|---|---|
存在的非空文件夾A | 不存在的文件夾B | 先在contanier中建立文件夾B,再將A文件夾中的全部文件copy到B中 |
存在的非空文件夾A | 存在的非空文件夾B | 先將container中文件夾B的原有內容清空,再將A中文件copy到B中 |
不管container中的文件夾B是否存在, A都會徹底覆蓋B的內容
host | container | mount result |
---|---|---|
存在的空文件夾A | 存在的非空文件夾B | container中文件夾B的內容被清空 |
container中對應的文件夾內容被清空
host | container | mount result |
---|---|---|
不存在的文件夾A | 存在的非空文件夾B | 在host上建立文件夾A,container中文件夾B的內容被清空 |
不存在的文件夾A/B/C | 存在的非空文件夾B | 在host上建立文件夾A/B/C,container中文件夾B的內容被清空 |
container中對應的文件夾內容被清空
host上文件夾必定會覆蓋container中文件夾:日誌
host | container | mount result |
---|---|---|
文件夾不存在/文件夾存在但爲空 | 文件夾不存在/存在但爲空/存在且不爲空 | container中文件被覆蓋(清空) |
文件夾存在且不爲空 | 文件夾不存在/存在但爲空/存在且不爲空 | container中文件夾內容被覆蓋(原內容清空, 覆蓋爲host上文件夾內容) |
文件掛載與文件夾掛載最大的不一樣點在於:code
除此以外, 其覆蓋行爲與文件夾掛載一致,即:遞歸
docker run -v /path-to-folder/non-existent-config.js:/path-to-folder/config.js test-image # forbidden
詳細說明以下:ci
host | container | mount result |
---|---|---|
不存在的文件configA.js | 已經存在的文件congfigB.js | 報錯,Are you trying to mount a directory onto a file (or vice-versa)? Check if the specified host path exists and is the expected type. 同時會在host上生成兩個空目錄 configA.js 和 configB.js, 可是container沒法啓動 |
host | container | mount result |
---|---|---|
存在的文件configA.js | 存在的文件congfigB.js | container中文件名configB.js保持不變,可是文件內容被congfigA.js的內容覆蓋了 |
存在的文件configA.js | 不存在的文件congfigB.js | container中新建一個文件configB.js,其內容爲configA.js的文件內容, configB.js所在文件下的全部其餘文件維持不變 |
host上文件必定會覆蓋container中文件夾get
host | container | mount result |
---|---|---|
不存在的文件 | 已經存在的文件 | 禁止行爲 |
存在的文件 | 不存在的文件/已經存在的文件 | 新增/覆蓋 (若目錄不存在則會建立目錄) |
(完)table
查看更多文章:系列文章目錄class