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

时间:2018-05-07 14:51:47

标签: postgresql docker docker-compose timescaledb

我正在尝试使用timecaledb扩展程序,因此我正在运行他们的official docker image

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

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

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

  

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

我发现我必须通过exec手动添加到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

2 个答案:

答案 0 :(得分:2)

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

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

因此,扩展程序将在postgres数据库的<{1}}数据库中创建,不是

您有两种选择如何更改:

1。使用testdb数据库

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

create extension

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

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

使用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

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

答案 1 :(得分:2)

要使用先前的答案进行切换,每个数据库都会应用TimescaleDB扩展,因此如果您在没有先使用\c yourdatabase连接到所需数据库的情况下运行build.sbt,它会将扩展应用于默认数据库。有关在安装后应用的分步说明,请参阅http://docs.timescale.com/v0.9/getting-started/setup