首页 > 解决方案 > 为什么有些 Docker 镜像没有定义 VOLUME?

问题描述

我只是从 Docker 开始,如果我的问题对你来说太傻了,请原谅我。

我看到一些图像,例如nginx,没有任何VOLUME定义,而一些图像,例如在他们的 Dockerfilemysql中定义。VOLUME

当没有定义卷时如何管理数据或文件,它们的工作目录是什么?

标签: dockerdockerfiledocker-volume

解决方案


您可以在容器中运行的许多应用程序的首选模式是在本地根本不存储任何状态。如果我有一个 Web 应用程序,它可能需要一个配置文件作为输入,但它将所有数据存储在外部数据库中,我不需要本地存储。反过来,这意味着我可以运行它的多个副本以实现冗余或支持更大的规模,并且如果我需要更换容器,我无需担心保留数据。如果我的容器实际上是无状态的,那么我不需要一个VOLUME(或在运行时将卷附加到我的容器)。

即使您的容器确实具有本地状态,您也可能不想要VOLUME. 真正的意思是,当VOLUME容器运行时,如果在指定的文件系统路径上没有挂载任何其他内容,则创建一个匿名卷并将其挂载在那里(让 Docker 从图像内容中填充它)。在实践中,这意味着:

  • 您可以使用docker run -vDocker Compose 或 Docker Composevolumes:在任何容器文件系统路径上挂载目录,无论它是否声明为VOLUME.
  • 如果某些东西被声明为 a VOLUME,则后面的RUN指令不能更改该目录树。
  • 如果某物被声明为 a VOLUME,则您永远无法创建在该位置具有不同内容的派生图像(例如,您无法创建FROM postgresql使用预加载数据派生的图像)。

VOLUME /tmp声明(在 Java Dockerfiles 中似乎很常见)或声明VOLUME应用程序代码的部分没有特别的意义。

VOLUME声明与图像的WORKDIR.


推荐阅读