摘要:文件掛載由于只會覆蓋單個文件而不會影響中同一文件夾下的其他文件,常常被用來掛載配置文件,以在運行時,動態(tài)的修改默認(rèn)配置。
背景介紹
docker volume 可以使我們在啟動docker容器時,動態(tài)的掛載一些文件(如配置文件), 以覆蓋鏡像中原有的文件,但是,掛載一個主機(jī)上尚不存在的文件夾或者文件到容器中會怎樣呢?LZ在工作中就遇到了這樣的問題,故自己實踐了一下,記錄實驗結(jié)果如下:
文件夾掛載docker在文件夾掛載上的行為是統(tǒng)一的,具體表現(xiàn)為:
若文件夾不存在,則先創(chuàng)建出文件夾(若為多層文件夾,則遞歸創(chuàng)建)
用host上的文件夾內(nèi)容覆蓋container中的文件夾內(nèi)容
docker run -v /path-to-folder/A:/path-to-folder/B test-image
詳細(xì)說明如下:
host上文件夾存在,且非空host | container | mount result |
---|---|---|
存在的非空文件夾A | 不存在的文件夾B | 先在contanier中創(chuàng)建文件夾B,再將A文件夾中的所有文件copy到B中 |
存在的非空文件夾A | 存在的非空文件夾B | 先將container中文件夾B的原有內(nèi)容清空,再將A中文件copy到B中 |
無論container中的文件夾B是否存在, A都會完全覆蓋B的內(nèi)容host上文件夾存在,但為空
host | container | mount result |
---|---|---|
存在的空文件夾A | 存在的非空文件夾B | container中文件夾B的內(nèi)容被清空 |
container中對應(yīng)的文件夾內(nèi)容被清空host上文件夾不存在
host | container | mount result |
---|---|---|
不存在的文件夾A | 存在的非空文件夾B | 在host上創(chuàng)建文件夾A,container中文件夾B的內(nèi)容被清空 |
不存在的文件夾A/B/C | 存在的非空文件夾B | 在host上創(chuàng)建文件夾A/B/C,container中文件夾B的內(nèi)容被清空 |
container中對應(yīng)的文件夾內(nèi)容被清空總結(jié)
host上文件夾一定會覆蓋container中文件夾:
host | container | mount result |
---|---|---|
文件夾不存在/文件夾存在但為空 | 文件夾不存在/存在但為空/存在且不為空 | container中文件被覆蓋(清空) |
文件夾存在且不為空 | 文件夾不存在/存在但為空/存在且不為空 | container中文件夾內(nèi)容被覆蓋(原內(nèi)容清空, 覆蓋為host上文件夾內(nèi)容) |
文件掛載與文件夾掛載最大的不同點在于:
docker 禁止用主機(jī)上不存在的文件掛載到container中已經(jīng)存在的文件
文件掛載不會對同一文件夾下的其他文件產(chǎn)生任何影響
除此之外, 其覆蓋行為與文件夾掛載一致,即:
用host上的文件的內(nèi)容覆蓋container中的文件的內(nèi)容
docker run -v /path-to-folder/non-existent-config.js:/path-to-folder/config.js test-image # forbidden
詳細(xì)說明如下:
host上文件不存在host | container | mount result |
---|---|---|
不存在的文件configA.js | 已經(jīng)存在的文件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保持不變,但是文件內(nèi)容被congfigA.js的內(nèi)容覆蓋了 |
存在的文件configA.js | 不存在的文件congfigB.js | container中新建一個文件configB.js,其內(nèi)容為configA.js的文件內(nèi)容, configB.js所在文件下的所有其他文件維持不變 |
host上文件一定會覆蓋container中文件夾
host | container | mount result |
---|---|---|
不存在的文件 | 已經(jīng)存在的文件 | 禁止行為 |
存在的文件 | 不存在的文件/已經(jīng)存在的文件 | 新增/覆蓋 (若目錄不存在則會創(chuàng)建目錄) |
允許不存在的文件夾或者存在的空文件夾掛載進(jìn)container, container中對應(yīng)的文件夾將被清空
非空文件夾掛載進(jìn)container將會覆蓋container中原有文件夾
文件掛載禁止將不存在的文件掛載進(jìn)container中已經(jīng)存在的文件上
存在的文件掛載進(jìn)container中將會覆蓋container中對應(yīng)的文件, 若文件不存在則新建
應(yīng)用場景從上面的分析可知,文件夾掛載以整個文件夾為單位進(jìn)行文件覆蓋,故可在需要將大量文件掛載進(jìn)container時使用,另外,如果掛載一個空文件夾或者不存在的文件夾,一般是做逆向使用: 即容器啟動后,可能會在容器內(nèi)掛載點的文件夾下生成一些文件(如日志),此時,在對應(yīng)的host上的文件夾內(nèi)就能直接看到。
文件掛載由于只會覆蓋單個文件而不會影響container中同一文件夾下的其他文件,常常被用來掛載配置文件,以在運行時,動態(tài)的修改默認(rèn)配置。
(完)
查看更多文章:系列文章目錄
文章版權(quán)歸作者所有,未經(jīng)允許請勿轉(zhuǎn)載,若此文章存在違規(guī)行為,您可以聯(lián)系管理員刪除。
轉(zhuǎn)載請注明本文地址:http://specialneedsforspecialkids.com/yun/27376.html
摘要:由于隔離的進(jìn)程獨立于宿主和其它的隔離的進(jìn)程,因此也稱其為容器。鏡像實際是由多層文件系統(tǒng)聯(lián)合組成。容器可以被創(chuàng)建啟動停止刪除暫停等。容器的實質(zhì)是進(jìn)程,但與直接在宿主執(zhí)行的進(jìn)程不同,容器進(jìn)程運行于屬于自己的獨立的命名空間。 Docker簡介 Docker 使用 Google 公司推出的 Go 語言 進(jìn)行開發(fā)實現(xiàn),基于 Linux 內(nèi)核的 cgroup,namespace,以及 AUFS ...
摘要:本文最早發(fā)表于本人博客快速入門指引是什么是公司開源的一個基于技術(shù)之上構(gòu)建的容器引擎,基于語言并遵從協(xié)議開源。指令用于設(shè)置用戶或來運行生成的鏡像和執(zhí)行指令。中定義的指令不會繼承到當(dāng)前引用的鏡像中,也就是當(dāng)引用的鏡像創(chuàng)建完成后將會清除所 本文最早發(fā)表于本人博客: Docker 快速入門指引 Docker是什么? Docker是 Docker.Inc 公司開源的一個基于 LXC技術(shù)之上構(gòu)建的...
摘要:背景中有的概念,其中對它的管理有點松散。鏡像是文件系統(tǒng)層次的根,任何被掛載到鏡像中的特定目錄上。中的每個容器必須獨立指定每個的位置。當(dāng)一個由于某種原因從節(jié)點上移除,中的數(shù)據(jù)也會被永久刪除。 容器中的磁盤文件是易失的,這給運行在容器中的大型應(yīng)用帶來了一些麻煩。首先,當(dāng)一個容器崩潰,kubelet會重啟它,但是之前存儲的文件會丟失 - 容器以一個初始的狀態(tài)重建。第二,當(dāng)在一個Pod中運行多...
閱讀 1507·2021-11-25 09:43
閱讀 4057·2021-11-15 11:37
閱讀 3192·2021-08-17 10:13
閱讀 3503·2019-08-30 14:16
閱讀 3535·2019-08-26 18:37
閱讀 2489·2019-08-26 11:56
閱讀 1128·2019-08-26 10:42
閱讀 609·2019-08-26 10:39