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 用途
最后更新于