首页 > 解决方案 > 如何修复:在 gitlab-ci 的 docker 容器中使用 Postgres 时出现“Psql:无法连接到服务器:连接被拒绝”

问题描述

我目前正在尝试在 Gitlab CI 中运行 fossology。Fossology 需要一个可以从使用 pg_dump 创建的模式设置的外部数据库。当我尝试使用 psql 时,出现标题错误。

目前,我有一个脚本来设置一个运行所需版本的 postgres (9.6) 的容器。然后它尝试在 postgres 容器中通过 psql 运行一个 .sql 脚本docker exec。这样做后,它会出现标题错误。

我尝试在发出 psql 语句时同时指定端口和主机,但两者都不起作用。我尝试使用 localhost、127.0.0.1、postgres 容器的 IP 地址和容器的名称作为主机。我试过用不同的脚本重写东西,但似乎没有任何效果。

经过广泛的谷歌搜索,许多人似乎有相同的错误消息,但原因不同,通常在使用 docker 容器托管数据库时也不会。

当我在命令行中运行脚本的内容时,我没有收到此错误,脚本工作正常,我可以连接到 Fossology。仅在尝试在 Gitlab CI 中执行相同操作时才会出现此问题。

在 Mac 上使用命令行时工作的步骤顺序(即逐行粘贴):

# creates blank database and hosts it in a docker container
docker run -d --name fossdb -p 5432:5432 postgres:9.6
docker cp /fossology_db_schema.sql fossdb:/fossy.sql 
docker exec -it fossdb bash
psql postgres -U postgres

# creates user needed for database to work with fossology
create user fossy with password 'fossy';
create database fossology;
grant all privileges on database fossology to fossy;
\q

# builds the fossology database in the hosted blank database
psql fossology < fossy.sql
psql postgres -U postgres
\connect fossology
exit

我在 GitLab CI 中尝试的内容:

# creates container with postgres image
docker run -d --name fossdb -p 5432:5432 --network foss-net postgres:9.6

# creates blank database (error occurs here)
docker exec fossdb psql -h $(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' fossdb) -f ./createBlank.sql -U postgres

# builds fossology database from schema 
docker exec fossdb psql -h $(docker inspect --format='{{range .NetworkSettings.Networks}}{{.IPAddress}}{{end}}' fossdb) fossology < ./schema.sql -U postgres

创建空白.sql:

create user fossy with password 'fossy';
create database fossology;
grant all privileges on database fossology to fossy;

预期结果:运行 createBlank.sql 创建一个名为 fossology 的空白数据库,然后从 schema 构建 fossology 数据库

实际结果: psql:无法连接到服务器:连接被拒绝 服务器是否在主机“172.19.0.2”上运行并接受端口 5432 上的 TCP/IP 连接?

标签: postgresqldockergitlab-cipsqlpostgresql-9.6

解决方案


你确定你完全设置了postgres吗?

您可以执行一些快速检查:

(对不起,你确实这样做了。转到建议 2)

建议1:你告诉postgres有一个用户有密码吗?(创建用户命令)

https://www.postgresql.org/docs/9.2/app-createuser.html

建议 2:您是否告诉 postgres 用户可以连接,以及如何连接?(tcp 或本地套接字)

https://www.postgresql.org/docs/9.2/auth-pg-hba-conf.html


推荐阅读