首页/云/Docker 容器速查/VOLUME 声明数据卷挂载点
镜像与构建107 条

VOLUME 声明数据卷挂载点

把路径标记为数据卷:运行未显式挂载时自动创建匿名卷;声明后不要再在构建期写该目录内容,文档明确这些改动会被丢弃。

Docker 容器速查云更新于 2026-10-13

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 之后再往该目录写内容,构建阶段的改动在运行时会丢失,数据初始化应当交给启动脚本或由挂载卷提供。
匿名卷会持续累积在宿主的卷目录里,长期运行的环境要定期核查与清理,否则磁盘会慢慢被吃掉。
需要往卷目录里放初始文件时,把初始化逻辑写进容器启动脚本,或用挂载的方式提供内容,不要依赖构建期写入。

易错点

  • 在 VOLUME 之后用 RUN 往该目录写文件,运行时发现文件不存在,容易误判成构建失败
  • 把应用代码目录声明成卷,运行时代码被匿名卷覆盖,启动行为与预期完全不符
  • 匿名卷长期不清理,宿主磁盘被逐渐占满,排查时往往先怀疑镜像
  • 用 --rm 启动带 VOLUME 的容器却不加 -v,匿名卷残留,时间一长难以辨认用途

数据来源与参考

  • Docker 官方文档:Dockerfile VOLUME(docs.docker.com)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌