我是Docker的新手,我正试图用Postgres运行它。然后我尝试运行python测试用例,这些测试用例适用于其他人而不是我。
以下错误告诉我Docker可能正在努力创建角色foo
:
E sqlalchemy.exc.OperationalError:(psycopg2.OperationalError) 致命:角色" foo"不存在
另一个错误:
E psycopg2.OperationalError:致命:角色" foo"不存在
Postgresql版本:mydb=# SELECT version();
:
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版本
Version 17.06.2-ce-mac27 (19124)
使用此脚本运行Docker:
docker run -p 5432:5432 --env POSTGRES_PASSWORD="bar" --env POSTGRES_USER="foo" --env POSTGRES_DB="mydb" postgres
脚本输出:如您所见,它显示CREATE ROLE
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
修改
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
答案 0 :(得分:1)
看起来像psycopg2尝试本地套接字连接。如果它通过TCP连接,您会看到以下异常:
用户" foo" 的密码验证失败
容器日志中出错:
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域套接字连接。