VOLUME 是什么
VOLUME 把镜像里的路径标记为数据卷挂载点:运行时若没有显式挂载,Docker 会自动创建匿名卷接上去。官方文档明确说明,声明 VOLUME 之后再往该目录写入的内容在运行时会丢失,所以构建阶段不要用它初始化数据。
基本信息
| 用途 | 声明数据持久化的挂载点 |
|---|---|
| 语法 | VOLUME /data 或 VOLUME ["/data", "/logs"] |
| 运行行为 | 未指定挂载时自动创建匿名卷 |
| 重要限制 | 声明后构建期对该目录的改动在运行时不生效 |
| 清理 | 匿名卷需单独清理,删容器时是否连带删除取决于参数 |
典型使用场景
- 数据库、上传目录这类必须持久化的路径用 VOLUME 声明,提醒使用者挂卷
- 多容器共享数据目录时明确挂载点,避免误写进容器可写层
- 排查“数据看起来丢了”:确认生成的是匿名卷还是挂载了预期的宿主目录
- 审计镜像时看清有哪些声明卷,评估运行时需要准备的存储
- 与只读根文件系统配合时,把必须可写的路径提前声明出来
- 迁移到编排平台时对应到持久卷声明,保持语义一致
示例
示例
VOLUME /data
VOLUME ["/var/lib/app", "/var/log/app"]
# 运行期显式挂载(推荐,避免生成匿名卷)
docker run -d -v app-data:/data app/api:1.4.2
docker volume ls # 查看匿名卷与具名卷卷相关的运行行为
| 运行方式 | 结果 | 注意事项 |
|---|---|---|
| 未指定挂载 | 自动创建匿名卷 | 卷名随机,清理时容易误删数据 |
| 给具名卷 | 挂载到指定卷 | 推荐,卷名可管理可备份 |
| 挂宿主目录 | bind 挂载到宿主路径 | 属主与权限由宿主决定 |
| --rm 配合 -v | 容器退出时连匿名卷一起删 | 不加 -v 时匿名卷会残留 |
声明 VOLUME 之后再往该目录写内容,构建阶段的改动在运行时会丢失,数据初始化应当交给启动脚本或由挂载卷提供。
匿名卷会持续累积在宿主的卷目录里,长期运行的环境要定期核查与清理,否则磁盘会慢慢被吃掉。
需要往卷目录里放初始文件时,把初始化逻辑写进容器启动脚本,或用挂载的方式提供内容,不要依赖构建期写入。