в докере и добавил entrypoint.
В нём я создаю расширение:
psql -v ON_ERROR_STOP=0 --username "$POSTGRES_USER" <<-EOSQL
CREATE EXTENSION IF NOT EXISTS "uuid-ossp";
EOSQL
Но получаю
CREATE EXTENSION
2022-01-12 21:54:35.795 UTC [47] LOG: received fast shutdown request
т.е. при выполнении этой строчки psql почему-то вырубается и не создаёт расширение(
чё делать?)
upd: он вырубется всегда, после выболнения скрипта. Но почему расширение не сохраняется?
up. помогите пж, что может быть
Посмотрите в логе сервера. Предположу, что при запуске С-шного кода инициализации расширения сервер падает
да дело в том, что при перезапуске он мне возвращает ещё extension already exist. Тем не менее в запущенном постгресе его нет. Как будто он при инициализации запускает какой-то другой обработчик sql. А потом вырубает и врубает нормальный
А хотя бы create table какой-нибудь, вручную сделанный, остаётся? А то вообще это умолчание в докере -- убивать контэйнер вместе с внешним слоем, насколько я помню.
да все остальные команды из начального скрипта работают норм (таблички создаются, пользователи)
ну и просто если отправить запрос на создание расширения - оно создаётся норм и остаётся
И да, если extension already exists -- то оно создалось. Если вам что-то не нравится в результатах его создания -- то так и пишыте.
его нет в запущенном psql, оно не создалось совсем. я могу продемонстрировать, если не верите
Я не очень понял, что значит "при перезапуске он мне возвращает ещё extension already exist". Но если упало в процессе инициализации, то может быть неконсистентное состояние расширения. Попробуйте разширение включить в preload_libraries —- может получите другую диагностику. Ещё можно увеличить DEBUG_LEVEL — опять другую диагностику. Но это всё имеет смысл, если вы будете эту диагностику честно искать в логах
В смысле -- про "совсем" ошыбаетесь. ТАк-то его можэт не быть в любом psql, конечно. Например, потому что там транзакцыя раньшэ открыта или потому, что он к другой базе подключён.
Пока что я предполагаю, что сценарий какой-то такой: у вас в докере не установлена какая-то библиотека, нужная для расширения (или не той версии). Когда вы говорите CREATE EXTENSION — оно падает и весь postgres тоже
он не падает, я ведь написал - он всегда перезапускается после выполнения скрипта entrypoint. Всегда, даже если там нет этой команды с расширениями
вот, я например два раза эту команду попробовал запустить - первый раз она прошла, второй раз написало already_exist
Вот эта фраза "LOG: received fast shutdown request" значит падает, имхо
Если бы падает -- было бы сказано про сигнал, который пришёл незадачливому процэссу и про то, что мы экстренно убиваемся, поскольку shared_buffers могут быть повреждены. А это -- ну, мало ли. Можэт, докер не настроен на работу постоянно.
Тогда может быть проблема именно в том, что после перезапуска расширения нет. Надо его тогда прописать в "автозагрузку"
а как это сделать?
Прописать библиотеку в параметр shared_preload_libraries + я видел стенд, где код стартапа тоже выполнялся, но сейчас не помню, как это делать
uuid? Это какая-то странная библиотека uuid, что ей нужно shared_preload_libraries.
Согласен, в описании расширения должно быть сказано, как его правильно инициализировать
Я думаю, что это предположэние насчёт shared_preload_libraries в данном случае неверно.
вот так сделал, не получилось, в логах ошибок нет
Теперь надо удостовериться, что подключаетесь вы к тому хосту, тому кластеру и той базе данных.
Для проверки можэте, кстати, запустить там на сервере нормальный psql с теми жэ аргументами, что вы для своего скрипта использовали -- и сделать тожэ самое из него.
И да, я не верю в чудеса. В то, что человек относительно новый в теме из dbeaverа промахнулся -- верю легко. В чудеса, когда расшырение есть для CREATE EXTENSION и нет для всех аналогов \dx -- не верю.
Вот здесь в середине фраза "PostgreSQL init process complete" меня смущает. Может оно создаёт новую базу между этими шагами?
в доке вычитал, что для сценариев entrypoints запускается "временный демон" Also, as of docker-library/postgres#440 , the temporary daemon started for these initialization scripts listens only on the Unix socket, so any usage should drop the hostname portion (see docker-library/postgres#474 (comment) for example).
Обсуждают сегодня