For the complete documentation index, see llms.txt. This page is also available as Markdown.

7.8 VOLUME 定义匿名卷

7.8.1 基本语法

VOLUME ["/路径1", "/路径2"]
VOLUME /路径

VOLUME 指令创建挂载点,并标记为外部挂载的卷。


7.8.2 为什么使用 VOLUME

核心原则:容器存储层应该保持无状态,任何运行时数据都应该存储在卷中。


7.8.3 基本用法

定义单个卷

定义多个卷


7.8.4 VOLUME 的行为

1. 自动创建匿名卷

如果运行时未指定挂载,Docker 会自动创建匿名卷:

2. 可被命名卷覆盖

3. 可被 Bind Mount 覆盖


7.8.5 VOLUME 在构建时的特殊行为

⚠️ 重要:VOLUME 之后再写入该目录的构建语义取决于 builder。legacy builder 会丢弃这些修改;BuildKit 会保留。但运行容器时,一旦该路径挂载了卷,卷会遮蔽镜像内同路径的内容。

原因:旧 builder 会在构建过程中为该目录创建临时匿名卷,后续写入发生在临时卷中;BuildKit 则会把修改保留在镜像层。为了避免不同 builder 下出现不同结果,也为了避免运行时卷遮蔽镜像内初始化数据,不要把必须存在的初始化文件写在 VOLUME 之后。

正确做法


7.8.6 常见使用场景

数据库持久化

日志目录

上传文件目录


7.8.7 查看 VOLUME 定义


7.8.8 VOLUME vs docker run -v

特性
Dockerfile VOLUME
docker run -v

定义时机

镜像构建时

容器运行时

默认行为

创建匿名卷

可指定命名卷或路径

灵活性

低(固定路径)

高(可任意指定)

适用场景

定义必须持久化的路径

灵活的数据管理


7.8.9 在 Compose 中

在 Compose 中配置如下:


7.8.10 安全注意事项

匿名卷可能导致数据丢失

解决:始终使用命名卷


7.8.11 最佳实践

1. 定义必须持久化的路径

2. 不要在 VOLUME 后修改目录

3. 文档中说明 VOLUME 用途


最后更新于