Postgres不允许使用"127.0.0.1",但可以使用"localhost"



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为什么会失败?我在下面提供了详细信息。还应该检查什么?

命令的精确重放

运行两个容器pgApgB

> 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

两种容器pgApgB的比较

  • 作为/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,这一行被附加:
    <container_ip>    <container_id>
    

相关问题

  • 一个完全相反的问题:Postgres不允许localhost,但可以使用127.0.0.1
  • 类似#1
  • 类似#2

没有意识到另一个第三个PG实例已经桥接了HostPort5432,这是一个愚蠢的疏忽。

感谢@jjanes提供的日志和IPv6提示。为了子孙后代,请检查日志!

LOG: could not bind IPv4 address "0.0.0.0": Address in use

相关内容

  • 没有找到相关文章

最新更新