【问题标题】:Postgres sql file seems to not finishPostgres sql文件似乎没有完成
【发布时间】:2023-04-07 10:27:01
【问题描述】:

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

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

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;

最后两个命令似乎没有运行。我可以与用户“只读”连接,但在使用 psql 重新运行数据库上的最后两个命令之前,模式“s”上会出现权限错误。

日志不包含错误或警告

【问题讨论】:

  • 这真的很奇怪。您可以执行该图像并运行 gosu postgres postgres --single
  • 是的,来自 postgres 的日志与 docker 日志一起出现。我可以看到数据库启动并且可以看到数据库正在被更改,但没有错误或问题迹象。我尝试在容器上运行 exec 以重新运行文件,但它给了我一个错误,提示“锁定文件“postmaster.pid”已经存在”
  • 也许你可以用 bash 执行,关闭 postmaster,然后尝试运行脚本?也许问题出在单用户模式上?我去看了我的数据库启动脚本,我使用多用户模式在 docker 中“初始化”数据库。这很有趣...stackoverflow.com/questions/28244869/…
  • 感谢其他问题的链接。看起来真正的问题是,虽然他们建议使用单用户模式,但实际上并没有实际工作。我有一个用于在远程服务器上运行脚本的 psql 包装器,我已经对其进行了修改以满足我对本地服务器的需求

标签: postgresql schema docker


【解决方案1】:

我在输入这个答案时突然想到你的 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

【讨论】:

  • 你是对的,虽然他们建议在 docker 容器中使用单用户模式,但这不是一个可行的解决方案。我有一个脚本,用于针对服务器批量运行 sql 脚本,并且我已经对其进行了修改,以更好地处理针对我的开发数据库的单个脚本。
  • 您是否认为对只读用户的授权在错误的数据库中?
猜你喜欢
  • 1970-01-01
  • 2017-03-29
  • 2022-01-04
  • 1970-01-01
  • 2016-01-31
  • 1970-01-01
  • 2014-08-01
  • 1970-01-01
  • 2014-11-04
相关资源
最近更新 更多