Теги: Docker
PostgreSQL
Наши тестировщики прониклись идеями контейнеризации и активно начинают использовать Docker в своих тестах (ручных, автоматизированных и т.д.)
Им очень нравится идея, что они могут просто взять контейнер PostgreSQL, закинуть туда БД и запускать тестируемые приложения с нужными данными
Но вот проблема, они работают следующим образом:
- Поднимают чистый контейнер
- Инициализируют его данными (закидывая в
docker-entrypoint-initdb.d
конечно же) - Запускают серию тестов
После этого им снова нужен чистый контейнер с теми же данными (т.е. приходится повторять шаги 1-2)
Иногда эти шаги достаточно длительные — см. пример в docker-entrypoint-initdb.d
Поэтому они очень просят сделать им образ уже сразу с инициализированным PostgreSQL, где в базе уже будут готовые данные (мы, конечно, понимаем, что это можно сделать и через docker commit
, но давайте попробуем обойтись docker build
, раз уж наш Навыкум про сборку контейнеров)
Название базы и её владельца (и пароль, конечно же) нужно передавать через аргументы при сборке образа
Спойлеры
Для решения этой задачи настоятельно рекомендуем ознакомиться с docker-library/postgres#496
Соберите образ с инициализированной БД, используя данные из docker-entrypoint-initdb.d
(для этого, конечно же, нужно написать Dockerfile
)
За основу возьмите образ 15.4-alpine3.18
При сборке через аргументы передавайте следующие данные:
- Имя БД —
db
(ARG DBNAME
) - Имя пользователя —
app
(ARG DBUSER
) - Пароль пользователя —
pass
(ARG DBPASS
)
Никаких доп.настроек не нужно
В собранном образе должен запускаться PostgreSQL на порту 5432 с инициализированной базой
В качестве реализации CI/CD пайплайна и Docker Registry можно использовать любые, например (из облачных и бесплатных), GitHub Actions и GitHub Packages