Не могу получить доступ к расширению postgres, созданному в файле точки входа Docker, пока я не создал его вручную в psql - PullRequest
0 голосов
/ 07 мая 2018

Я пытаюсь использовать расширение timescaledb, и поэтому я запускаю их официальный образ докера .

В последней строке моего файла точки входа в докер я запускаю:

CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;

Я подтверждаю, что он доступен для использования с \dx в psql. Как только я пытаюсь использовать расширение, я получаю:

Ни одна функция не соответствует заданному имени и типу аргумента. Возможно, вам потребуется добавить явные приведения типов.

Я считаю, что должен добавить его вручную, 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 голосов
/ 08 мая 2018

Чтобы присоединиться к предыдущему ответу, расширение TimescaleDB применяется к каждой базе данных, поэтому, если вы запустите CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE; без предварительного подключения к нужной базе данных с помощью \c yourdatabase, оно применит расширение к базе данных по умолчанию. См. http://docs.timescale.com/v0.9/getting-started/setup для пошаговых инструкций для применения после установки.

0 голосов
/ 08 мая 2018

Отказ от ответственности: я не знаю, докер, но, похоже, это касается только 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, а не только что созданного.

...