如何在官方postgres docker镜像中使用密码?

oknwwptz  于 2023-10-16  发布在  Docker
关注(0)|答案(2)|浏览(184)

尝试使用官方postgres docker镜像:

docker run --rm -d \
        --name my-postgres \
        --network my-network \
        -e POSTGRES_USER=postgres \
        -e POSTGRES_PASSWORD=mysuperduperlongpwstring \
        -e POSTGRES_DB=postgres \
        -v /path/to/postgres/data/:/var/lib/postgresql/data
        postgres

但是,当使用Go创建postgres连接时,

psqlInfo := fmt.Sprintf(
                "host=%s port=%s user=%s password=%s dbname=%s sslmode=%s",
                os.Getenv("DB_HOST"),
                os.Getenv("DB_PORT"),
                os.Getenv("DB_USER"),
                os.Getenv("DB_PASSWORD"),
                os.Getenv("DB_NAME"),
                os.Getenv("DB_SSL_MODE"),
        )
        db, err := sql.Open("postgres", psqlInfo)
        if err != nil {
                panic(err)
        }

最后我总是
panic: pq: password authentication failed for user "postgres"
我没有任何其他方法来验证mysuperduperlongpwstring

  • 尝试从docker容器内使用psql -U postgres -d postgres --password连接数据库,并给予任何密码都可以正常工作。
  • 尝试在docker容器中更改密码,将得到

ERROR: must be superuser to alter replication roles or change replication attribute
也就是说,基本上下面的答案对我不再起作用了:

由于缺乏资源,我在启动docker时多次更改mysuperduperlongpwstring,并相应地更改Go PW,但每次都以同样的失败告终。
请问问题出在哪里?如何使用官方postgres docker重置密码?

0s0u357o

0s0u357o1#

看起来你的超强密码中有特殊的字符,这导致了这个,看看这个question,我的建议是使用url.QueryEscape这样:

psqlInfo := fmt.SprintF("postgresql://%s:%s@%s:%s/%s?sslmode=%s",
  os.Getenv("DB_USER"),
  url.QueryEscape(os.Getenv("DB_PASSWORD")),
  os.Getenv("DB_HOST"),
  os.Getenv("DB_PORT"),
  os.Getenv("DB_NAME"),
  os.Getenv("DB_SSL_MODE"),
)
0yycz8jy

0yycz8jy2#

在一个docker容器中,假设你从一个空的卷开始,'postgres'将是一个超级用户,所以你不会得到关于它需要成为超级用户的错误。
我看到的唯一合理的解释是,要么你没有在你认为你运行了的地方运行psql,要么你没有从一个空卷开始,所以你的docker run命令只是启动了一个现有的数据库,因此你的“-e POSTGRES*”配置都被忽略了。所以无论如何,你要么没有连接到你认为你是什么,要么它没有按照你认为的方式配置。

相关问题