如何解决Docker中PostgreSQL的No space left on device错误
解决Docker中PostgreSQL磁盘空间不足问题
一、查看容器及卷的剩余空间
1. 查看容器内部磁盘使用
先列出运行中的容器,找到目标PostgreSQL容器的名称:
docker ps
进入容器查看磁盘使用情况,重点关注PGDATA目录和临时文件目录:
docker exec -it db-15 df -h
(把db-15换成你的目标容器名,比如db-13)
2. 查看Docker命名卷的实际占用
查看卷的宿主机挂载路径:
docker volume inspect app-db-data
复制输出里的Mountpoint路径(比如/var/lib/docker/volumes/app-db-data/_data),然后在宿主机上执行:
df -h /var/lib/docker/volumes/app-db-data/_data
就能看到该卷的总空间和剩余空间。
二、扩容方案
方案1:直接扩容宿主机磁盘
如果是宿主机本身磁盘不够,直接扩容宿主机的磁盘(比如云服务器扩容云盘、物理机添加硬盘),扩容完成后Docker卷会自动使用新增的空间,无需额外配置。
方案2:迁移Docker卷到更大的磁盘
如果无法扩容原有磁盘,可将数据迁移到更大的磁盘:
- 停止目标容器:
docker-compose stop db-15
- 备份现有卷的数据到新磁盘路径:
docker run --rm -v app-db-data:/source -v /path/to/new/large/disk:/target busybox cp -av /source/. /target/.
(把/path/to/new/large/disk换成你实际的大磁盘路径)
3. 修改docker-compose.yml,将命名卷改为绑定挂载到新路径:
services: db-15: # 保留其他原有配置 volumes: - /path/to/new/large/disk:/var/lib/postgresql/data/pgdata # 删除原来volumes节点下的app-db-data
- 启动容器:
docker-compose up -d db-15
- 确认数据正常后,删除旧的命名卷:
docker volume rm app-db-data
方案3:修改PostgreSQL临时文件存储路径
错误中的pgsql_tmp是PostgreSQL的临时文件目录,批量更新会生成大量临时文件。可以把这个目录挂载到宿主机空间更大的路径:
- 在宿主机创建临时目录并设置权限(PostgreSQL容器内用户ID是999):
mkdir -p /path/to/large/tmp chown 999:999 /path/to/large/tmp
- 修改
docker-compose.yml,添加临时目录挂载:
services: db-15: # 保留其他原有配置 volumes: - app-db-data:/var/lib/postgresql/data/pgdata - /path/to/large/tmp:/var/lib/postgresql/data/pgdata/base/pgsql_tmp
- 重启容器:
docker-compose restart db-15
三、额外优化建议
- 拆分批量更新SQL,每次更新1000-5000行,避免一次性生成过大的临时文件。
- 调整PostgreSQL的
work_mem和maintenance_work_mem参数,增加内存分配,减少磁盘临时文件的使用(需要修改postgresql.conf并挂载到容器)。
内容的提问来源于stack exchange,提问作者TreeWater
相关产品推荐
相关产品推荐

