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

Docker部署的PostgreSQL 15.4进程被Signal 13终止,如何解决?

解决PostgreSQL 15.4 Docker容器Signal 13(Broken pipe)终止问题

从日志来看,核心问题是容器异常关机触发PostgreSQL自动恢复流程,同时伴随连接中断导致的Broken pipe信号终止进程,以下是针对性解决步骤:

1. 排查容器异常关机根源

  • 查看容器退出状态与系统日志:
    # 查看容器退出码和停止原因
    docker inspect <container-id> | grep -A5 "ExitCode"
    # 检查宿主机是否存在OOM、存储IO或网络异常
    dmesg | grep -i "oom\|ioerror\|network"
    
  • 规范容器停止方式:禁止用docker kill强制终止,改用docker stop给PostgreSQL足够时间完成checkpoint;Docker Compose可添加配置:
    services:
      postgres:
        image: postgres:15.4
        stop_signal: SIGINT
        stop_grace_period: 30s
    

2. 修复损坏的数据目录

日志中database system was not properly shut down提示数据目录可能损坏:

  • 停止所有问题容器:
    docker stop $(docker ps -q -f ancestor=postgres:15.4)
    
  • 备份现有数据(必须先执行):
    cp -r /path/to/your/postgres/data /path/to/backup/postgres_data_$(date +%Y%m%d)
    
  • 启动临时容器尝试自动恢复:
    docker run -d --name pg-recovery -v /path/to/your/postgres/data:/var/lib/postgresql/data postgres:15.4 postgres -P
    
    查看恢复日志:docker logs pg-recovery,恢复成功后重启正常容器;若失败则从备份恢复,或初始化新目录后导入数据。

3. 解决Signal 13(Broken pipe)问题

Signal 13由连接异常中断引发,可通过以下方式优化:

  • 调整PostgreSQL TCP保活参数,快速检测断开连接:
    启动容器时添加参数:
    docker run -d \
      -e POSTGRES_PASSWORD=your_password \
      -v /path/to/postgres/data:/var/lib/postgresql/data \
      postgres:15.4 \
      -c tcp_keepalives_idle=60 \
      -c tcp_keepalives_interval=10 \
      -c tcp_keepalives_count=5
    
  • 检查客户端连接逻辑:确认应用是否存在进程崩溃、超时设置不合理等异常断开情况,确保客户端正常关闭连接。
  • 排查Docker网络:若用自定义网络,检查是否存在丢包、端口冲突,或宿主机防火墙阻断连接。

4. 宿主机层面排查

多个容器同时出问题,大概率是宿主机环境异常:

  • 检查资源使用率:用top/htop确认CPU、内存是否耗尽导致容器被Kill。
  • 检查存储状态:用df -h确认磁盘是否满额,iostat -x 1排查IO错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.11 01:20:38