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

Can't access postgres extention created in docker entrypoint file, until I manually created it in psql

我正在尝试使用 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 和 运行ning CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

手动添加它

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

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

#!/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 用户创建的,而不是新创建的用户。

为了配合之前的答案,TimescaleDB 扩展适用于每个数据库,因此如果您 运行 CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; 没有先使用 \c yourdatabase 连接到您想要的数据库,它将适用默认数据库的扩展。有关安装后应用的分步说明,请参阅 http://docs.timescale.com/v0.9/getting-started/setup