首页 > 解决方案 > 无法访问在 docker 入口点文件中创建的 postgres 扩展,直到我在 psql 中手动创建它

问题描述

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

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

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

我验证它可以\dx在 psql 中使用。一旦我尝试使用扩展程序,我就会得到:

没有函数匹配给定的名称和参数类型。您可能需要添加显式类型转换。

我发现我必须通过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

标签: postgresqldockerdocker-composetimescaledb

解决方案


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


create extensionpsql将在当前连接的数据库中创建扩展。看到脚本,这很可能是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.连接新创建的数据库

在使用命令 inpsql创建扩展之前,从内部切换到新创建的数据库\connectpsql

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


推荐阅读