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

Docker容器无法连接PostgreSQL:psql连接失败求助

问题排查与解决方案

核心问题分析

  1. psql未指定数据库主机:start-dev.sh中执行psql时默认尝试连接本地Unix套接字,但web容器内没有运行Postgres服务,导致连接失败。
  2. 数据库未就绪就执行导入:depends_on仅保证db容器启动,不代表Postgres服务已完全可用,直接执行schema导入会因服务未就绪失败。
  3. db容器的extra_hosts配置错误:将db主机名指向127.0.0.1会破坏Docker内部DNS解析,干扰容器间通信。
  4. server.pid路径错误:start-dev.sh中删除pid文件的路径与容器内实际路径不符。

具体修复步骤

1. 修正docker-compose.yml配置

删除db服务的extra_hosts配置,同时添加数据持久化卷避免数据丢失:

version: '3'
services:
  db:
    tty: true
    image: postgres
    environment:
      POSTGRES_DB: fusionsolar
      POSTGRES_USER: fusionsolar
      POSTGRES_PASSWORD: fusionsolar
    ports: 
      - "5432:5432"
    volumes:
      - dbdata:/var/lib/postgresql/data

  web:
    tty: true
    build: .
    volumes:
      - ./public:/mnt/public
    ports:
      - "3000:3000"
    depends_on:
      - db
    environment:
      DB_HOST: db
      POSTGRES_DB: fusionsolar
      POSTGRES_USER: fusionsolar
      POSTGRES_PASSWORD: fusionsolar

volumes:
  dbdata:

2. 修复start-dev.sh脚本

  • 指定psql连接的主机、用户信息,使用环境变量
  • 添加数据库就绪等待逻辑
  • 修正server.pid路径
#!/bin/bash

DATABASE_NAME="fusionsolar"
DB_DUMP_LOCATION="./schema.sql"

# 等待Postgres服务就绪
echo "*** WAITING FOR DATABASE ***"
until psql -h "$DB_HOST" -U "$POSTGRES_USER" -d "$POSTGRES_DB" -c '\q'; do
  >&2 echo "Postgres is unavailable - sleeping"
  sleep 2
done

echo "*** CREATING DATABASE ***"
psql -h "$DB_HOST" -U "$POSTGRES_USER" -d "$POSTGRES_DB" < "$DB_DUMP_LOCATION";
echo "*** DATABASE CREATED! ***"

# 修正pid文件路径
rm -f /myapp/tmp/pids/server.pid
bundle install --jobs 20 --retry 5

rails server -b 0.0.0.0 -p 3000

3. 优化Dockerfile(可选)

移除不必要的systemctl安装,容器内无需systemd服务管理:

RUN apt-get update -qq && apt-get install -y nodejs postgresql-client
WORKDIR /myapp

COPY . /myapp/

RUN bundle install

COPY entrypoint.sh /usr/bin/
RUN chmod +x /usr/bin/entrypoint.sh
ENTRYPOINT ["entrypoint.sh"]
EXPOSE 3000

CMD ./start-dev.sh

验证修复

执行以下命令重新构建并启动服务:

docker compose down -v  # 停止服务并删除卷
docker compose up --build

此时web容器会先等待Postgres服务完全就绪,再执行schema导入,之后启动Rails服务,连接问题即可解决。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 01:57:47