docker - 为什么有些 Docker 镜像没有定义 VOLUME?
问题描述
我只是从 Docker 开始,如果我的问题对你来说太傻了,请原谅我。
我看到一些图像,例如nginx
,没有任何VOLUME
定义,而一些图像,例如在他们的 Dockerfilemysql
中定义。VOLUME
当没有定义卷时如何管理数据或文件,它们的工作目录是什么?
解决方案
您可以在容器中运行的许多应用程序的首选模式是在本地根本不存储任何状态。如果我有一个 Web 应用程序,它可能需要一个配置文件作为输入,但它将所有数据存储在外部数据库中,我不需要本地存储。反过来,这意味着我可以运行它的多个副本以实现冗余或支持更大的规模,并且如果我需要更换容器,我无需担心保留数据。如果我的容器实际上是无状态的,那么我不需要一个VOLUME
(或在运行时将卷附加到我的容器)。
即使您的容器确实具有本地状态,您也可能不想要VOLUME
. 真正的意思是,当VOLUME
容器运行时,如果在指定的文件系统路径上没有挂载任何其他内容,则创建一个匿名卷并将其挂载在那里(让 Docker 从图像内容中填充它)。在实践中,这意味着:
- 您可以使用
docker run -v
Docker Compose 或 Docker Composevolumes:
在任何容器文件系统路径上挂载目录,无论它是否声明为VOLUME
. - 如果某些东西被声明为 a
VOLUME
,则后面的RUN
指令不能更改该目录树。 - 如果某物被声明为 a
VOLUME
,则您永远无法创建在该位置具有不同内容的派生图像(例如,您无法创建FROM postgresql
使用预加载数据派生的图像)。
VOLUME /tmp
声明(在 Java Dockerfiles 中似乎很常见)或声明VOLUME
应用程序代码的部分没有特别的意义。
VOLUME
声明与图像的WORKDIR
.
推荐阅读
- .net - 如何成功地将 React 应用部署到 Azure
- c++ - 如何从模板类中重载创建的指针对象上的运算符?
- selenium - 一段时间后Geckodriver突然停止工作并且日志停止生成
- sql - SQL 透视列值
- java - 从 csv 文件中读取第一个元素时出错
- python - How to do aggregation at the sametime for few columns in python pandas?
- javascript - 递归函数:返回 null
- c++ - 从私有成员类派生的模板类打破了封装
- c# - 我在编辑个人资料部分有一个详细信息视图。用户应该能够编辑他的个人资料并保存更改
- sql - 如果一个表有一个未索引列与索引列是一对多关系,如何优化未索引列的查询?