PostgreSQL Docker 角色不存在。

76

我下载了PostgreSQL的Docker容器: https://hub.docker.com/r/library/postgres/ ,并执行以下操作:

$ docker run --name satgres -e POSTGRES_PASSWORD=mysecretpassword -d -p 5432:5432 postgres
satgres | "docker-entrypoint.s…" | 5 seconds ago | Up 6 seconds | 0.0.0.0:5432->5432/tcp | satgres
$ docker exec -it c8f1b22cc41e /bin/bash        
# psql -U postgres
psql (10.1)
postgres=# CREATE DATABASE mytest;
postgres=# \password postgres
postgres=# CREATE ROLE ming WITH LOGIN PASSWORD 'pass1234';
postgres=# ALTER ROLE ming CREATEDB;
postgres=# CREATE DATABASE sjk;
postgres=# GRANT ALL PRIVILEGES ON DATABASE youtube TO ming;
postgres=# \connect sjk
youtube=# ALTER ROLE ming lOGIN;  

我的计划是在Django上使用这个数据库,所以我首先想检查一下能否连接,但是我无法连接。

$ psql -h localhost -p 5432 -U postgres
$ psql: FATAL:  role "postgres" does not exist
$ psql -h localhost -p 5432 -U ming
$ psql: FATAL:  role "ming" does not exist

我使用PSequal.app做同样的事情,出现了同样的错误, 我在Mac High Sierra上运行。

为什么会出现这个错误?这个角色存在,或者至少在我的看来是这样...


唯一的解决方案在这里 https://github.com/docker-library/postgres/issues/756#issuecomment-979818733 - Ram
3个回答

139

问题非常简单,我的电脑已经在运行一个Postgres实例,我不知道它仍然在运行(不在Docker内),端口号为:5432,使用以下命令进行检查:

$ lsof -n -i:5432 | grep LISTEN

所以我记得我是通过https://gist.github.com/sgnl/609557ebacd3378f3b72安装的,我运行了

$ pg-stop

然后我连接到Docker实例时没有问题。

编辑(2019/07/02)

最近这个问题的浏览量超过了10,000次,所以我想详细说明一下这是为什么。

通常情况下,通过docker运行,使用python并连接到postgres数据库需要安装psycopg2,可以通过pip3 install psycopg2来安装,但是如果你运行此命令,你将会得到:

Error: pg_config executable not found.

这是因为psycopg2需要操作系统安装postgres库:

yum install postgresql-devel
apt-get install postgresql-client

现在,在 Mac 上,您需要使用 brew 执行相同的操作:

brew install postgresql

我之前没有意识到的一件事是,在Mac上执行上述操作不仅会安装所需的库,还会在:5432上启动一个数据库。由于所有这些都在后台完成,因此我没有想到这是问题所在,因为通常不会弹出任何错误提示来告知端口正在使用等等......


35
我也遇到了同样的问题。你的回答解决了我的难题 :) 谢谢。(给以后的用户,如果你在 Mac 上使用 brew 安装了 postgres,想要停止它只需要使用 brew services stop postgresql 命令,然后你就可以连接到 docker 中的 postgres 实例了) - SRC
3
我在使用我的MAC电脑,所以我需要执行以下操作:brew services stop postgresql。 - Ayudh
2
我遇到了同样的问题,于是决定在我的~/.bash_profile中编写一个函数来检查端口上运行的内容:checkaport(){ lsof -n -i:$1 }。然后你可以在执行了source ~/.bash_profile之后这样使用它:checkaport 5432 - deusofnull
由于这个问题,我浪费了很多时间 - 我在Mac上运行本地的postgres,并尝试连接到Docker中的一个postgres。 - bogdan.rusu
谢谢,这让我想起了本地服务brew services stop postgresqlbrew services stop postgresql@<version> - Dominic
真让人惊讶的是,没有地方提到使用brew安装postgres实际上会在后台启动一个端口为5432的数据库!难怪我从来无法使用端口5432连接到docker实例。 - dragonfly02

29

在我的情况下,问题也可能是由于使用了一个不是postgres的超级用户。Lhe开发人员选择了geOrchestra docker组合中的用户georchestra。

从dockerfile中提取:

environment:
  - POSTGRES_USER=georchestra

HEALTHCHECK --interval=30s --timeout=30s \
  CMD pg_isready -U $POSTGRES_USER

因此,您将需要使用选项“-U georchestra”来连接到容器。

$ docker exec -it docker_database_1 psql -U georchestra
psql (10.5 (Debian 10.5-1.pgdg90+1))
Type "help" for help.

当然,尝试与用户postgres建立连接会导致错误:

docker exec -it docker_database_1 psql -U postgres
psql: FATAL:  role "postgres" does not exist

1
非常感谢,问题就在于我没有一个名为postgres的超级用户。 - allexiusw

17
如果你正在使用docker-compose,可以在你的docker-compose.yml文件中添加一个名为postgres的用户,像这样:
environment:
  - POSTGRES_USER=postgres
    (...rest of variables)

注意:执行以下命令将导致删除所有卷,从而导致数据库中的所有数据丢失。

最后,在删除卷的同时重新启动您的容器(们):

docker-compose down --volumes && docker-compose up

3
请确保您理解,所有卷将被删除。 - karambaq
这是一个有点奇怪的建议,使用上述命令删除所有卷。要从头开始创建一个新的用于Postgres的存储,您需要删除Postgres卷(如果它是命名卷,请使用docker volume ls找到要删除的正确卷),或者删除包含Postgres数据的文件夹(如果它是绑定卷)。 - undefined

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接