Postgres在容器中运行,使用postgres:14.1-alpine
映像。
当用--network host
运行A(时,则
PGPASSWORD=postgres psql -d db -U postgres -h localhost # works
PGPASSWORD=postgres psql -d db -U postgres -h 127.0.0.1 # fails
当在没有--network host
的情况下运行B(时,上述两个主机都可以工作。
错误为
psql: error: connection to server at "127.0.0.1", port 5432 failed:
FATAL: password authentication failed for user "postgres"
A(中的-h 127.0.0.1
为什么会失败?我在下面提供了详细信息。还应该检查什么?
命令的精确重放
运行两个容器pgA和pgB:
> docker run -d --rm -it --network host
-e POSTGRES_PASSWORD=postgres -ePOSTGRES_USER=postgres -e POSTGRES_DB=db
--name pgA
postgres:14.1-alpine
OUTPUT: <containerA_id>
> docker run -d --rm -it
-e POSTGRES_PASSWORD=postgres -ePOSTGRES_USER=postgres -e POSTGRES_DB=db
--name pgB
postgres:14.1-alpine
OUTPUT: <containerB_id>
尝试使用-h 127.0.0.1
:连接两者
> docker exec -it
pgA
bash -c ' PGPASSWORD=postgres psql -h 127.0.0.1 -d db -U postgres'
OUTPUT: psql: error: connection to server at "127.0.0.1", port 5432 failed:
FATAL: password authentication failed for user "postgres"
> docker exec -it
pgB
bash -c ' PGPASSWORD=postgres psql -h 127.0.0.1 -d db -U postgres'
OUTPUT: psql (14.1)
Type "help" for help.
db=#
环境
> docker --version
Docker version 20.10.11, build dea9396
> uname -a
Darwin foo.local 20.6.0 Darwin Kernel Version 20.6.0:
Mon Aug 30 06:12:20 PDT 2021; root:xnu-7195.141.6~3/RELEASE_ARM64_T8101 arm64
两种容器pgA
和pgB
的比较
作为
/var/lib/postgresql/data/
的直接后代的所有文件都是相同的(除了postmaster.pid
中的不同PID(。例如,postgresql.conf
包含listen_addresses = '*'
在A(和
B(类似地,
pg_hba.conf
是相同的local all all trust # IPv4 local connections: host all all 127.0.0.1/32 trust # IPv6 local connections: host all all ::1/128 trust # Allow replication connections from localhost, by a user with the # replication privilege. local replication all trust host replication all 127.0.0.1/32 trust host replication all ::1/128 trust
(
/var/lib/postgresql/data/
的子目录,如pg_wal/
、base/
等,可能不同-尚未检查。(netstat -anpt | grep 5432
是相同的
tcp 0 0 0.0.0.0:5432 0.0.0.0:* LISTEN -
tcp 0 0 :::5432 :::* LISTEN
/etc/hosts
几乎完全相同。。。
…除了B(与127.0.0.1 localhost ::1 localhost ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters
--network bridge
,这一行被附加:<container_ip> <container_id>
相关问题
- 一个完全相反的问题:Postgres不允许localhost,但可以使用127.0.0.1
- 类似#1
- 类似#2
没有意识到另一个第三个PG实例已经桥接了HostPort
5432,这是一个愚蠢的疏忽。
感谢@jjanes提供的日志和IPv6提示。为了子孙后代,请检查日志!
LOG: could not bind IPv4 address "0.0.0.0": Address in use