Я пытаюсь использовать расширение timescaledb, поэтому запускаю их официальный образ докера.
В последней строке моего файла точки входа в докер я запускаю:
CREATE EXTENSION IF NOT EXISTS timescaledb CASCADE;
Я проверяю, что он доступен для использования с \dx в psql. Как только я пытаюсь использовать расширение, я получаю:
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
Я отредактировал, чтобы добавить сценарий точки входа сейчас.
Я не вижу запуска сервера postgresql в вашей точке входа. Это заставляет меня думать, что реальный демон postgresql не запускается при выполнении точки входа.





Отказ от ответственности: я не знаю докера, но, похоже, это связано только с Postgres, а не с самим Docker
create extension создаст расширение в базе данных, к которой в данный момент подключен psql. Судя по сценарию, это, скорее всего, база данных по умолчанию postgres, к которой вы подключаетесь.
Таким образом, расширение будет создано в базе данных postgres, нет - в базе данных testdb.
У вас есть два варианта, как это изменить:
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
Обратите внимание, что расширение создается раньше всего. Фактический порядок не так важен, важно только то, что он был выполнен перед, создав новую базу данных.
Переключитесь на вновь созданную базу данных из 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.
Не могли бы вы поделиться своим скриптом точки входа?