Postgres不允许使用`127.0.0.1`,但是可以使用`localhost`。
Postgres不允许使用`127.0.0.1`,但是可以使用`localhost`。
Postgres在容器中运行,使用postgres:14.1-alpine
镜像。
当以A) 使用--network host
运行时,
PGPASSWORD=postgres psql -d db -U postgres -h localhost # 正常 PGPASSWORD=postgres psql -d db -U postgres -h 127.0.0.1 # 失败
当以B) 不使用--network host
运行时,上述两个主机都可以正常工作。
错误是
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 输出:> docker run -d --rm -it \ -e POSTGRES_PASSWORD=postgres -ePOSTGRES_USER=postgres -e POSTGRES_DB=db \ --name pgB \ postgres:14.1-alpine 输出:
尝试使用-h 127.0.0.1
连接两个容器:
> docker exec -it \ pgA \ bash -c ' PGPASSWORD=postgres psql -h 127.0.0.1 -d db -U postgres' 输出: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' 输出: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
几乎相同...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
... 除了B) 使用
--network bridge
,追加了这一行:
相关问题
问题原因:在本地运行Postgres时,无法使用`127.0.0.1`作为主机地址,但可以使用`localhost`。
解决方法:检查日志文件,发现错误日志`LOG: could not bind IPv4 address "0.0.0.0": Address in use`。这表明已经有另一个程序占用了主机地址的端口号5432。解决方法是找到并关闭占用该端口号的程序。
在本地运行Postgres时,有人遇到了一个问题,无法使用`127.0.0.1`作为主机地址,但可以使用`localhost`。通过检查错误日志,找到了问题的原因,并提供了解决方法。
问题的原因是在运行Postgres之前,已经有另一个程序占用了主机地址的端口号5432。这个问题是因为作者忽视了这一点。通过检查日志文件,发现了错误日志`LOG: could not bind IPv4 address "0.0.0.0": Address in use`。这个错误提示表明,已经有另一个程序正在使用相同的主机地址。
解决这个问题的方法是找到并关闭占用端口号5432的程序。作者感谢某人提供的日志和IPv6提示,并建议大家在遇到类似问题时,要仔细检查日志文件,以便找到问题的根源。
当在本地运行Postgres时,如果无法使用`127.0.0.1`作为主机地址,但可以使用`localhost`,那么很可能是因为另一个程序已经占用了主机地址的端口号5432。解决方法是找到并关闭占用该端口号的程序。