如何在Docker Compose中为持久化Volume设置最大容量
在Docker Compose中为持久化卷设置最大容量
我目前的Docker Compose配置用于持久化PostgreSQL数据库数据,基于PostgreSQL官方镜像的Compose示例编写,配置如下:
version: '3' services: postgresql: restart: unless-stopped container_name: postgresql image: postgres:14-alpine shm_size: 256mb healthcheck: test: ['CMD', 'pg_isready', '-U', 'postgres'] volumes: - postgres-data:/var/lib/postgresql/data env_file: - env-files/postgresql.env volumes: postgres-data:
当前这个配置会使用local驱动创建无容量限制的卷。我尝试过用tmpfs设置容量,但tmpfs是内存挂载,重启后数据丢失,完全不适合数据库场景,而且size选项是tmpfs特有的,通用挂载参数里并没有这个选项。另外我注意到docker volume create有--limit-bytes参数,但Docker Compose里找不到对应的配置项,想知道在Compose中创建并管理持久化卷时,正确设置最大容量的方式是什么(当前用v3,切换到v2也可以)。
可行解决方案
方法一:通过local驱动的driver_opts传递文件系统挂载参数(依赖宿主机文件系统)
如果你的宿主机使用的是支持挂载时指定容量的文件系统(比如btrfs、zfs),可以直接在Compose的卷定义中通过driver_opts传递对应参数。以btrfs为例,配置如下:
version: '3' services: postgresql: restart: unless-stopped container_name: postgresql image: postgres:14-alpine shm_size: 256mb healthcheck: test: ['CMD', 'pg_isready', '-U', 'postgres'] volumes: - postgres-data:/var/lib/postgresql/data env_file: - env-files/postgresql.env volumes: postgres-data: driver: local driver_opts: type: btrfs o: size=10G device: /dev/sdb1
注意:不同文件系统的挂载参数差异很大,需要根据宿主机实际使用的文件系统调整参数。
方法二:预先创建带容量限制的卷,在Compose中引用
先通过Docker CLI创建带有容量限制的卷:
docker volume create --driver local --limit-bytes 10737418240 postgres-data
(上述命令设置卷容量为10GB,10737418240是1010241024*1024的字节数)
然后在Compose配置中将该卷声明为外部卷,直接引用:
version: '3' services: postgresql: restart: unless-stopped container_name: postgresql image: postgres:14-alpine shm_size: 256mb healthcheck: test: ['CMD', 'pg_isready', '-U', 'postgres'] volumes: - postgres-data:/var/lib/postgresql/data env_file: - env-files/postgresql.env volumes: postgres-data: external: true
这种方式兼容性更好,只要你的Docker版本支持--limit-bytes参数即可,无需依赖特定文件系统。
额外说明
- tmpfs仅适合临时存储场景,绝对不能用于数据库持久化,因为重启容器或宿主机后数据会完全丢失。
--limit-bytes是Docker对local驱动的扩展功能,并非所有文件系统都支持,建议提前测试宿主机环境的兼容性。
内容的提问来源于stack exchange,提问作者Megan Walker
相关产品推荐
相关产品推荐

