Postgres sql 文件似乎没有完成

Postgres sql file seems to not finish

我正在使用 postgres docker 映像创建一个本地数据库用于开发。该图像的一个特点是目录中的任何 shell 脚本在启动时都将是 运行,我用它来设置我的架构和用户。一切都非常适合创建我的架构和具有完全访问权限的用户,但是当我创建只读用户时,事情似乎不起作用。该脚本似乎突然停止而没有授予我请求的只读访问权限。这不是语法问题,因为我可以使用 psql 连接到数据库并复制粘贴完美运行的命令。

shell 脚本 运行 目录中的任何 sql 个文件,目前只有一个。

for sql in /docker-entrypoint-initdb.d/*.sql
do
    gosu postgres postgres --single < $sql
done

获取 运行 的实际 sql 文件(已编辑连接详细信息)

-- Main user with full access to its schema
CREATE SCHEMA s;
CREATE USER u PASSWORD 'p';
GRANT ALL ON SCHEMA s TO u;
GRANT ALL ON ALL TABLES IN SCHEMA s TO u;


-- Readonly user
CREATE USER readonly PASSWORD 'r';

-- THE FOLLOWING DOESN'T SEEM TO RUN
-- Allows read on everything in schema s
GRANT USAGE ON SCHEMA s TO readonly;
GRANT SELECT ON ALL TABLES IN SCHEMA s TO readonly;

最后两个命令似乎 运行。我可以与用户 'readonly' 连接,但会在模式 's' 上出现权限错误,直到我使用 psql 重新 运行 数据库上的最后两个命令。

日志中没有错误或警告

我在输入这个答案时突然想到你的 postgres --single 命令行没有引用数据库。架构设置是否可能发生在 'postgres' 数据库中,而您真的希望它出现在目标数据库中!?!无论如何,从引用的 SO 答案来看,在多用户模式下进行此设置可能是个好主意。我会这样做:

echo "Starting PostgreSQL server..."
/etc/init.d/postgresql start

for sql in /docker-entrypoint-initdb.d/*.sql
do
    gosu postgres psql -Upostgres -h $(hostname -i) -f ${sql} ${DB_NAME}
done

echo "Done with initialization ... database "$DB_NAME" is ready to use"

/etc/init.d/postgresql stop

当然你要担心这里的pg_hba访问方法。在我的环境中,我信任来自私有 IP 地址 YMMV 的连接。 -g