Postgres不允许使用`127.0.0.1`,但是可以使用`localhost`。

13 浏览
0 Comments

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

具体命令的重现

运行两个容器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
输出:
> 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

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,追加了这一行:

        
    

相关问题

0
0 Comments

问题原因:在本地运行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。解决方法是找到并关闭占用该端口号的程序。

0