[英]docker persistent storage via volume
所有讀到的都是說我們可以通過VOLUME
控件創建 docker 持久存儲,例如, here和here 。
但是,我的Dockerfile
有以下Dockerfile
:
VOLUME ["/home", "/root"]
但那里沒有保存任何東西(我嘗試touch abc
,當我退出並再次返回時,文件不在那里)。
我看到官方的用法沒有其他特殊的控制或處理,但它可以提供持久存儲,即使apt-cacher-ng
服務容器停止。
這怎么可能? 我已經檢查了以下內容,但仍然沒有任何線索:
總之,正如這里所解釋的:
第一種機制將為請求基於主機的持久性的容器創建一個隱式存儲沙箱。 ... 要理解的關鍵是存儲在沙箱中的數據不可用於其他容器,除了請求它的容器。
如何使持久存儲工作? 為什么每次都會擦除我的更改,而apt-cacher-ng
服務容器即使停止和重新啟動也可以保持其持久存儲? 我在這里沒有看到的“其他特殊控制或治療”是什么?
請用簡單的Dockerfile
(不是docker-compose.yml
)解釋。
問題是當使用 docker run 時,VOLUME 指令會創建一個外部存儲,而該特定文件夾沒有“mount”選項。 換句話說,每次為該映像創建容器時,docker 都會創建一個帶有隨機標簽的新卷,但由於您沒有為這些卷命名,新容器無法重用現有生成的卷。
例如
FROM ubuntu
RUN mkdir /myvol
RUN echo "hello world" > /myvol/greeting
VOLUME /myvol
鑒於此 Dockerfile,如果您只是使用以下命令構建並運行此 docker 映像:
echo "There are currently $(docker volume ls | wc -l) volumes"
docker build -t my_volume_test:latest .
docker run --name another_test my_volume_test:latest
echo "There are currently $(docker volume ls | wc -l) volumes"
您會看到機器上的卷數量增加了。 該容器現在使用一個卷來存儲數據,但該特定卷沒有名稱或標簽,因此它僅綁定到該特定容器。 如果您刪除並重新創建該容器,除非您設法掛載之前創建的卷,否則 docker 將生成一個具有隨機名稱的新卷。
如果你想讓它變得簡單,我建議先創建卷然后安裝它。 例如
docker rm -f another_test
docker volume create my-vol
docker run \
--name another_test \
--mount source=my-vol,target=/myvol \
my_volume_test:latest
# alternative
docker rm -f another_test
docker run \
--name another_test \
-v my-vol:/myvol \
my_volume_test:latest
在這種情況下,您可以創建和刪除任意數量的容器,但它們都將使用相同的卷。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.