You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何解决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卷到更大的磁盘

如果无法扩容原有磁盘,可将数据迁移到更大的磁盘:

  1. 停止目标容器:
docker-compose stop db-15
  1. 备份现有卷的数据到新磁盘路径:
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
  1. 启动容器:
docker-compose up -d db-15
  1. 确认数据正常后,删除旧的命名卷:
docker volume rm app-db-data

方案3:修改PostgreSQL临时文件存储路径

错误中的pgsql_tmp是PostgreSQL的临时文件目录,批量更新会生成大量临时文件。可以把这个目录挂载到宿主机空间更大的路径:

  1. 在宿主机创建临时目录并设置权限(PostgreSQL容器内用户ID是999):
mkdir -p /path/to/large/tmp
chown 999:999 /path/to/large/tmp
  1. 修改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
  1. 重启容器:
docker-compose restart db-15

三、额外优化建议

  • 拆分批量更新SQL,每次更新1000-5000行,避免一次性生成过大的临时文件。
  • 调整PostgreSQL的work_mem和maintenance_work_mem参数,增加内存分配,减少磁盘临时文件的使用(需要修改postgresql.conf并挂载到容器)。

内容的提问来源于stack exchange,提问作者TreeWater

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.30 15:23:18