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

Я пытаюсь использовать расширение 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

Не могли бы вы поделиться своим скриптом точки входа?

whites11 07.05.2018 22:28

Я отредактировал, чтобы добавить сценарий точки входа сейчас.

Escher 08.05.2018 08:40

Я не вижу запуска сервера postgresql в вашей точке входа. Это заставляет меня думать, что реальный демон postgresql не запускается при выполнении точки входа.

whites11 08.05.2018 08:42
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
3
752
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Ответ принят как подходящий

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

Другие вопросы по теме