Docker volume 掛載時文件或文件夾不存在

背景介紹

docker volume 可使咱們在啓動docker容器時,動態的掛載一些文件(如配置文件), 以覆蓋鏡像中原有的文件,可是,掛載一個主機上尚不存在的文件夾或者文件到容器中會怎樣呢?LZ在工做中就遇到了這樣的問題,故本身實踐了一下,記錄實驗結果以下:docker

文件夾掛載

docker在文件夾掛載上的行爲是統一的,具體表現爲:segmentfault

  • 若文件夾不存在,則先建立出文件夾(若爲多層文件夾,則遞歸建立)
  • 用host上的文件夾內容覆蓋container中的文件夾內容
docker run -v /path-to-folder/A:/path-to-folder/B test-image

詳細說明以下:bash

host上文件夾存在,且非空

host container mount result
存在的非空文件夾A 不存在的文件夾B 先在contanier中建立文件夾B,再將A文件夾中的全部文件copy到B中
存在的非空文件夾A 存在的非空文件夾B 先將container中文件夾B的原有內容清空,再將A中文件copy到B中
不管container中的文件夾B是否存在, A都會徹底覆蓋B的內容

host上文件夾存在,但爲空

host container mount result
存在的空文件夾A 存在的非空文件夾B container中文件夾B的內容被清空
container中對應的文件夾內容被清空

host上文件夾不存在

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 禁止用主機上不存在的文件掛載到container中已經存在的文件
  • 文件掛載不會對同一文件夾下的其餘文件產生任何影響

除此以外, 其覆蓋行爲與文件夾掛載一致,即:遞歸

  • 用host上的文件的內容覆蓋container中的文件的內容
docker run -v /path-to-folder/non-existent-config.js:/path-to-folder/config.js test-image # forbidden

詳細說明以下:ci

host上文件不存在

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上文件存在

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
不存在的文件 已經存在的文件 禁止行爲
存在的文件 不存在的文件/已經存在的文件 新增/覆蓋 (若目錄不存在則會建立目錄)

結論

文件夾掛載

  • 容許不存在的文件夾或者存在的空文件夾掛載進container, container中對應的文件夾將被清空
  • 非空文件夾掛載進container將會覆蓋container中原有文件夾

文件掛載

  • 禁止將不存在的文件掛載進container中已經存在的文件上
  • 存在的文件掛載進container中將會覆蓋container中對應的文件, 若文件不存在則新建

應用場景

  1. 從上面的分析可知,文件夾掛載以整個文件夾爲單位進行文件覆蓋,故可在須要將大量文件掛載進container時使用,另外,若是掛載一個空文件夾或者不存在的文件夾,通常是作逆向使用: 即容器啓動後,可能會在容器內掛載點的文件夾下生成一些文件(如日誌),此時,在對應的host上的文件夾內就能直接看到。
  2. 文件掛載因爲只會覆蓋單個文件而不會影響container中同一文件夾下的其餘文件,經常被用來掛載配置文件,以在運行時,動態的修改默認配置。

(完)table

查看更多文章:系列文章目錄class

相關文章
相關標籤/搜索