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