如何指定Docker卷大小?Docker卷默认容量及配置报错排查
1. Docker卷默认大小说明
Ubuntu 20.04上Docker 20.10默认使用overlay2存储驱动,这种场景下通过local驱动创建的普通命名卷(即你最初用-v jenkins_home:/var/jenkins_home创建的卷)没有独立的硬配额限制。这类卷默认存储在宿主机/var/lib/docker/volumes/路径下,实际可用空间等于该路径所在宿主机分区的剩余可用空间,不存在默认只分配几百兆的规则。
你遇到Jenkins提示388MB就即将占满的问题,大概率是宿主机上/var/lib/docker所在的系统分区本身剩余空间不足,不是Docker卷默认设置了过小的配额。
2. 现有docker-compose配置报错原因
你在driver_opts中添加o: "size=900m"的写法,仅适用于local驱动挂载独立块设备(比如单独磁盘分区、虚拟loop设备)的场景,这类场景必须同时指定device参数(即块设备的系统路径),直接给普通文件系统目录挂载加这个参数必然触发“缺少必填device选项”的报错。如果你不需要给卷设置固定硬配额,完全不需要添加这类driver_opts配置。
3. 大容量Jenkins存储卷的正确配置方案
你不需要tmpfs临时存储,要实现大容量持久化,选以下两种方案之一即可:
方案一:使用默认命名卷(最简便,推荐)
如果宿主机/var/lib/docker所在分区空间足够,直接删除compose文件中volumes.jenkins_home下的所有driver_opts配置即可,修改后的卷配置如下:
volumes: jenkins_home:
这种方式创建的卷没有空间上限,实际占用随Jenkins数据增长动态变化,只要宿主机对应分区有剩余空间就不会触发存储不足告警。如果/var/lib/docker所在分区空间过小,可以先修改Docker daemon配置,将数据根目录迁移到大容量磁盘分区,再启动容器即可。
方案二:绑定挂载宿主机大空间目录(适配单独数据盘场景)
如果你不想修改Docker默认数据路径,可以直接将宿主机上大容量分区下的目录绑定挂载到容器内,操作步骤如下:
- 首先在宿主机大容量分区下创建Jenkins数据目录,并配置正确权限(Jenkins容器内运行服务的用户UID为1000,权限配置错误会导致启动失败):
mkdir -p /data/jenkins_home chown -R 1000:1000 /data/jenkins_home - 修改docker-compose.yml的卷配置,删除原有的命名卷定义,直接绑定宿主机路径:
services: jenkins: build: context: . dockerfile: ./Dockerfile volumes: - /var/run/docker.sock:/var/run/docker.sock - /data/jenkins_home:/var/jenkins_home ports: - 8082:8080 - 50001:50000 # 删除文件末尾原有的volumes顶层配置块
这种方式下Jenkins数据直接存在你指定的宿主机目录中,可用空间等于该目录所在分区的剩余空间,完全满足大容量存储需求。
补充说明
你提供的Dockerfile配置没有逻辑问题,内置安装Docker CLI的配置可以正常实现容器内操作宿主机Docker的需求,无需调整。如果配置完成后启动仍提示空间不足,可在宿主机执行df -h查看对应挂载路径所在分区的剩余空间,确认是否为分区本身空间不足导致。
内容的提问来源于stack exchange,提问作者emiliojab

