Docker容器无法连接PostgreSQL:psql连接失败求助
问题排查与解决方案
核心问题分析
- psql未指定数据库主机:
start-dev.sh中执行psql时默认尝试连接本地Unix套接字,但web容器内没有运行Postgres服务,导致连接失败。 - 数据库未就绪就执行导入:
depends_on仅保证db容器启动,不代表Postgres服务已完全可用,直接执行schema导入会因服务未就绪失败。 - db容器的extra_hosts配置错误:将
db主机名指向127.0.0.1会破坏Docker内部DNS解析,干扰容器间通信。 - 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
相关产品推荐
相关产品推荐

