Niestandardowe extensions w PostgreSQL z użyciem Docker-a

Problem

Gdy korzystasz ze standardowego obrazu Docker-a dla PostgreSQL dostępnego na Docker HUB — TUTAJ będzie w nim dostępne wszystko z podstawowych funkcjonalności PostgreSQL.

Jednakże… jeśli w swoim rozwiązaniu używasz niestandardowych rozszerzeń (takich, które nie są dostępne w postgres-contrib - więcej TUTAJ, jak pg_cron lub ostatnio popularny pg_vector (AI buzz :)), będziesz musiał rozszerzyć standardowy obraz.

W przeciwnym razie, gdy na przykład spróbujesz przywrócić bazę danych ze swojego środowiska deweloperskiego (z zainstalowanymi rozszerzeniami), do lokalnego środowiska (z podstawowym obrazem), powita Cię następujący błąd:

postgres.public> create extension pg_cron
[2024-01-14 20:02:10] [0A000] ERROR: extension "pg_cron" is not available
[2024-01-14 20:02:10] Detail: Could not open extension control file "/usr/share/postgresql/15/extension/pg_cron.control": No such file or directory.
[2024-01-14 20:02:10] Hint: The extension must first be installed on the system where PostgreSQL is running.

Rozwiązanie

Aby rozwiązać ten problem należy stworzyć własny obraz na podstawie obrazu z Docker Hub.

W nowo utworzonym pliku Dockerfile będziesz musiał zainstalować potrzebne rozszerzenia.

Przykład: pg_cron

Na stronie githuba pg_cron (tutaj) znajdziesz instrukcję instalacji dla wybranej dystrybucji Linuksa.

W przypadku Debiana będziesz chciał użyć

sudo apt-get -y install postgresql-16-cron

Ale hej, czym jest to 16 w nazwie? 16, jak pewnie już wydedukowałeś, Sherlock-u oznacza wersję PostgreSQL.

Jeśli chcesz zainstalować go dla innej wersji PostgreSQL sprawdź dostępność TUTAJ

Tak więc, jeśli używasz na przykład PostgreSQL w wersji 15, użyjesz postgresql-15-cron

Mając to na uwadze, możemy teraz zbudować pożądany plik Dockerfile.

Kod


FROM postgres:15-bullseye

LABEL maintainer="DataCraze Postgres v.15 images based on postgres:15-bullseye with pg_cron and pg_vector extensions."

RUN apt-get update

RUN apt-get update \
      && apt-get install -y curl \
      && apt-get -y install postgresql-15-pgvector \
      && apt-get -y install postgresql-15-cron

RUN echo "shared_preload_libraries='pg_cron'" >> /usr/share/postgresql/postgresql.conf.sample
RUN echo "cron.database_name='<YOUR_SPECIAL_DB_NAME>'" >> /usr/share/postgresql/postgresql.conf.sample

Dzięki temu wystarczy teraz zbudować obraz: docker build -f Dockerfile -t YOUR_FANCY_IMAGE_TAG_WITH_VERSION .

Dzięki,
Krzysztof

Chcesz być na bieżąco z nowymi postami?
Skorzystaj z poniższego formularza, aby dołączyć do newslettera Data Craze Weekly!

Data Craze Weekly

Cotygodniowa porcja wartościowych informacji ze świata danych!
Inżynieria danych, analityka, how-to prosto do Twojej skrzynki.

    Zero spamu, 100% wartości.


    Administratorem danych osobowych niezbędnych w procesie przetwarzania, w tym podanych powyżej, jest Data Craze - Krzysztof Bury, ul. Piaski 50, 30-199 Rząska, NIP: 7922121365. Zapisując się na newsletter wyrażasz zgodę na przetwarzanie swoich danych osobowych (imię, e-mail) w ramach działań DataCraze.


    Formularz jest chroniony przez reCAPTCHA od Google Polityka Prywatności i Regulamin usługi.

    Skomentuj artykuł na Twitter.