docker - 通过卷 docker 持久存储
问题描述
读到的所有内容都在说我们可以通过VOLUME
控件创建 docker 持久存储,例如here和here。
但是,我有以下内容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
在这种情况下,您可以创建和删除任意数量的容器,但它们都将使用相同的卷。
推荐阅读
- asp.net - 在 updatePanel 内时,引导工具提示颜色发生了变化
- git - Gitlab:更改历史后无法强制推送(预接收挂钩被拒绝)
- laravel - 将 Blade If Else 转换为 Vue If Else
- python - Cloud Jupter 笔记本 Numpy .so 文件“无法从共享对象映射段”
- amazon-web-services - AWS Cognito 用户池需要在 CF 模板部署后在控制台中手动保存
- numpy - 产品的有效总和
- reactjs - 使用 react-spring 反应打字稿类型错误
- gitlab - Gitlab wiki 搜索结果显示 markdown 语法
- email - msgraph api,通过搜索字符串过滤共享邮箱
- c# - 在堆积条形图上获取平均值而不是总计?