我正在尝试在Docker容器中设置Postgres进行开发。有我的 Dockerfile :
FROM postgres:10.2
ADD ./init-test-db.sql /docker-entrypoint-initdb.d/init-test-db.sql
ADD ./postgresql.conf /etc/postgresql/postgresql.conf
ADD ./pg_hba.conf /tmp/pg_hba.conf
ADD ./copy-conf.sh /docker-entrypoint-initdb.d/copy-conf.sh
EXPOSE 5432
我使用 init-test-db.sql 来创建数据库用户和数据库:
CREATE USER testUser WITH LOGIN PASSWORD 'testUserPsw';
CREATE DATABASE testdb;
GRANT ALL PRIVILEGES ON DATABASE testdb TO testUser;
我使用自己的 postgresql.conf 版本来确保设置 listen_addresses ='*'。 copy-conf.sh 用于将 pg_hba.conf 版本复制到容器内的Postgres:
#!/bin/bash
cp /tmp/pg_hba.conf /var/lib/postgresql/data/pg_hba.conf
我的 pg_hba.conf 在默认配置中添加一行:
# TYPE DATABASE USER ADDRESS METHOD
host all all 0.0.0.0/0 md5
构建我的泊坞窗图像的命令:
docker build -t postgres-test .
运行容器的命令:
docker run -p 5432:5432 --name testpg -e POSTGRES_PASSWORD=postgrespsw postgres-test
我希望能够使用本地计算机上的testUser登录Docker容器中的Postgres。我尝试在Postgres容器中看到错误消息:
[72] FATAL: password authentication failed for user "testUser"
[72] DETAIL: Role "testUser" does not exist.
Connection matched pg_hba.conf line 83: "host all all 0.0.0.0/0 md5"
我可以使用 postgres 超级用户进行连接。所以似乎Postgres是可访问的。 testUser 有问题。
我试过这个SQL语句:
SELECT u.usename AS "User name",
u.usesysid AS "User ID",
CASE WHEN u.usesuper AND u.usecreatedb THEN CAST('superuser, create database' AS pg_catalog.text)
WHEN u.usesuper THEN CAST('superuser' AS pg_catalog.text)
WHEN u.usecreatedb THEN CAST('create database' AS
pg_catalog.text)
ELSE CAST('' AS pg_catalog.text)
END AS "Attributes"
FROM pg_catalog.pg_user u
ORDER BY 1;
它表明testUser在那里。也许有人知道我的设置有什么问题?