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 进程写不进去。