gpt4 book ai didi

postgresql - 无法访问在 docker 入口点文件中创建的 postgres 扩展,直到我在 psql 中手动创建它

转载 作者:行者123 更新时间:2023-11-29 14:06:17 28 4
gpt4 key购买 nike

我正在尝试使用 timescaledb 扩展,所以我正在运行他们的 official docker image .

在我的 docker 入口点文件的最后一行,我运行:

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

我确认它可用于 psql 中的 \dx。一旦我尝试使用该扩展程序,我就会得到:

No function matches the given name and argument types. You might need to add explicit type casts.

我发现我必须通过 execing 到 psql 并运行 CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

手动添加它

我的入口点有什么问题?为什么我必须在容器构建并运行后手动创建扩展?

编辑:这是完整的入口点脚本:

#!/bin/bash
set -e

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
EOSQL

最佳答案

免责声明:我不了解 docker,但这似乎只与 Postgres 有关,与 Docker 本身无关


create extension 将在当前连接到的数据库 psql 中创建扩展。查看脚本,这很可能是您连接到的默认数据库 postgres

因此扩展将在postgres 数据库中创建,不会testdb 数据库中创建。

关于如何更改它,您有两种选择:

1。使用template1数据库

template1 数据库中创建的任何内容都将自动在之后创建的每个数据库中创建。因此,如果您连接到模板数据库并在创建测试数据库之前运行 create extension,该扩展将自动可用:

psql -v ON_ERROR_STOP=1 --dbname=template1 --username "$POSTGRES_USER" <<-EOSQL
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
EOSQL

请注意,扩展是在其他任何事情之前创建的。实际顺序并不那么重要,唯一重要的是在创建新数据库之前完成。

2。连接到新创建的数据库

psql 中使用 \connect 命令创建扩展之前,从 psql 中切换到新创建的数据库

psql -v ON_ERROR_STOP=1 --username "$POSTGRES_USER" <<-EOSQL
CREATE USER test_user PASSWORD 'password123';
ALTER USER test_user WITH SUPERUSER; --needed to create timescaledb extension
CREATE DATABASE testdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE testdb TO test_user;
CREATE DATABASE tsdb OWNER test_user;
GRANT ALL PRIVILEGES ON DATABASE tsdb TO test_user;
ALTER USER test_user CREATEDB;
\connect testdb
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
EOSQL

这两种方法的主要区别在于,对于第一种方法,扩展将在将来创建的所有数据库中自动可用。而对于第二种方法,它仅在 testdb

中可用

无关,但是:新创建的用户不需要 superuser 权限,因为扩展是使用 postgres 用户创建的,而不是新创建的用户。

关于postgresql - 无法访问在 docker 入口点文件中创建的 postgres 扩展,直到我在 psql 中手动创建它,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/50217034/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com