首页/云/Docker 容器速查/compose volumes 字段写法
Compose 编排55 条

compose volumes 字段写法

服务级卷挂载:短语法写 源:目标[:ro],长语法用 type/source/target 显式声明;相对路径按项目目录解析。

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

volumes 字段怎么写

compose 的 volumes 字段把宿主目录、具名卷或单个文件挂进容器:短语法写 源:目标[:ro],长语法用 type、source、target 逐项声明。相对路径按项目目录(默认是 compose 文件所在目录)解析,换个目录执行就会挂到别的地方。

基本信息

短语法./data:/app/data、appdata:/var/lib/app、./nginx.conf:/etc/nginx/nginx.conf:ro
长语法type(bind 或 volume)配 source、target、read_only
相对路径相对项目目录,默认取 compose 文件所在目录
具名卷需在顶层 volumes 里声明后才能用卷名引用
只读:ro 或 read_only: true 阻止容器内写入

典型使用场景

  • 开发环境用 bind 挂载源码目录,改代码立即生效,不必反复重建镜像
  • 生产环境用具名卷存数据库与上传文件,容器重建数据不丢
  • 用 :ro 把配置与证书只读挂进去,防止应用意外改写
  • 多个服务共享同一具名卷(如静态资源目录),避免互相复制
  • 单文件挂载(nginx 配置、定时任务文件)替代整目录挂载,影响面更小
  • 用 external: true 复用其他项目或手工创建的既有卷

示例

示例
services:
  api:
    image: app/api:1.4.2
    volumes:
      - ./config:/app/config:ro       # 宿主目录,只读挂载
      - appdata:/var/lib/app          # 具名卷,数据持久化
      - ./nginx.conf:/etc/nginx/nginx.conf:ro
      - type: bind                    # 长语法,显式声明类型
        source: ./certs
        target: /etc/ssl/private
        read_only: true

volumes:
  appdata:                            # 顶层声明,缺了会报卷未定义

几种写法怎么选

写法示例适用场景
bind 目录./src:/app/src开发环境改代码即时生效
bind 单文件./nginx.conf:/etc/nginx/nginx.conf覆盖单个配置文件,改动范围可控
具名卷appdata:/var/lib/app数据库、上传目录,跨容器生命周期保留
外部卷ext:/data 配 external: true复用已有的卷,多项目共享数据
短语法里裸写名字(appdata:/path)会被当作卷名而不是目录;误把目录名当卷名时 Compose 会静默创建新卷,看起来像数据丢了,其实在新卷里。
宿主路径不存在时,部分平台的 bind 挂载会失败,或由守护进程自动创建 root 属主目录,导致容器内非 root 进程写不进去。

易错点

  • 把相对路径当成相对当前工作目录,从别的目录执行命令会挂到意外位置,用 docker compose config 展开确认绝对路径
  • 数据库数据目录用 bind 挂载到宿主时没注意属主与文件系统支持,容器内用户可能写不了,换具名卷更省心
  • 挂载的宿主目录权限与容器内运行用户的 UID 对不上,表现为日志或上传失败,先对齐属主
  • 为图方便挂载整个宿主根目录(如 /:/host)会绕过容器隔离,尽量不用

数据来源与参考

  • Docker 官方文档:Compose volumes 参考(docs.docker.com/reference/compose-file/services)
​‌‌​​‌​​​‌‌​‌‌‌‌​‌‌​​​‌‌​‌‌‌​​‌‌​​‌​‌‌‌​​‌‌‌​​​‌​‌‌​‌​​‌​‌‌‌​​​‌​‌‌​‌​​‌​‌‌​​​‌‌​‌‌‌​‌​​​‌‌​‌‌‌‌​​‌​‌‌‌​​‌‌​​​‌‌​‌‌​‌‌‌‌​‌‌​‌‌​‌