github编辑

7.8 VOLUME 定义匿名卷

7.8.1 基本语法

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

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


7.8.2 为什么使用 VOLUME

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

spinner

7.8.3 基本用法

定义单个卷

FROM mysql:8.0
VOLUME /var/lib/mysql

定义多个卷


7.8.4 VOLUME 的行为

1. 自动创建匿名卷

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

2. 可被命名卷覆盖

3. 可被 Bind Mount 覆盖


7.8.5 VOLUME 在构建时的特殊行为

⚠️ 重要:VOLUME 之后对该目录的修改会被丢弃!

原因:VOLUME 指令之后,Docker 将该目录视为外部挂载点,不再记录对它的修改。

正确做法


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 用途


最后更新于