关于python:Docker角色创建错误 – 角色___不存在

Docker role creation error - role ___ does not exist

我是Docker的新手,我正试图用Postgres运行它。 然后我尝试运行python测试用例,这些测试用例适用于其他人而不是我。

以下错误告诉我Docker可能正在努力创建角色foo

E sqlalchemy.exc.OperationalError: (psycopg2.OperationalError)
FATAL: role"foo" does not exist

另一个错误:

E psycopg2.OperationalError: FATAL: role"foo" does not exist

Postgresql版本:mydb=# SELECT version();

1
2
 PostgreSQL 9.6.5 on x86_64-apple-darwin16.7.0, compiled by Apple LLVM version 8.1.0 (clang-802.0.42), 64-bit
(1 row)

Docker版本

1
Version 17.06.2-ce-mac27 (19124)

使用此脚本运行Docker:

1
docker run -p 5432:5432 --env POSTGRES_PASSWORD="bar" --env POSTGRES_USER="foo" --env POSTGRES_DB="mydb" postgres

脚本输出:如您所见,它表示CREATE ROLE

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
The files belonging to this database system will be owned by user"postgres".
This user must also own the server process.

The database cluster will be initialized with locale"en_US.utf8".
The default database encoding has accordingly been set to"UTF8".
The default text search configuration will be set to"english".

Data page checksums are disabled.

fixing permissions on existing directory /var/lib/postgresql/data ... ok
creating subdirectories ... ok
selecting default max_connections ... 100
selecting default shared_buffers ... 128MB
selecting dynamic shared memory implementation ... posix
creating configuration files ... ok
running bootstrap script ... ok
performing post-bootstrap initialization ... ok
syncing data to disk ... ok

Success. You can now start the database server using:

    pg_ctl -D /var/lib/postgresql/data -l logfile start


WARNING: enabling"trust" authentication for local connections
You can change this by editing pg_hba.conf or using the option -A, or
--auth-local and --auth-host, the next time you run initdb.
waiting for server to start....LOG:  could not bind IPv6 socket: Cannot assign requested address
HINT:  Is another postmaster already running on port 5432? If not, wait a few seconds and retry.
LOG:  database system was shut down at 2017-09-26 21:28:17 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started
 done
server started
CREATE DATABASE

CREATE ROLE


/usr/local/bin/docker-entrypoint.sh: ignoring /docker-entrypoint-initdb.d/*

LOG:  received fast shutdown request
LOG:  aborting any active transactions
LOG:  autovacuum launcher shutting down
waiting for server to shut down....LOG:  shutting down
LOG:  database system is shut down
 done
server stopped

PostgreSQL init process complete; ready for start up.

LOG:  database system was shut down at 2017-09-26 21:28:19 UTC
LOG:  MultiXact member wraparound protections are now enabled
LOG:  database system is ready to accept connections
LOG:  autovacuum launcher started

编辑

1
2
3
CONTAINER ID        IMAGE               COMMAND                  CREATED             STATUS                     PORTS                    NAMES
bbab7eb98fcf        postgres           "docker-entrypoint..."   10 seconds ago      Up 11 seconds              0.0.0.0:5432->5432/tcp   hardcore_wilson
a6a1e2e313b8        postgres           "docker-entrypoint..."   16 minutes ago      Exited (0) 6 minutes ago                            nervous_banach

看起来像psycopg2尝试本地套接字连接。 如果是通过TCP连接,您会看到以下异常:

password authentication failed for user"foo"

容器日志中的错误:

1
2
3
FATAL:  password authentication failed for user"foo"
DETAIL:  Role"foo" does not exist.
    Connection matched pg_hba.conf line 95:"host all all all md5"

确保已设置host连接参数。 如果没有设置,psycopg2将回退到使用UNIX套接字。

编辑:

当传递localhost连接参数时,psycopg2似乎更喜欢UNIX套接字用于连接。 如果有两个postgres实例正在运行,一个监听UNIX套接字,一个监听TCP端口5432,psycopg2将在传递类似postgresql://localhost:5432的URL时通过UNIX域套接字连接。