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!
Skomentuj artykuł na Twitter.