Где-то полгода назад по личной инициативе я стал разворачивать компоненты в docker контейнерах для разработки и тестирования продуктов. При этом самая сложная система состояла из базы данных (postgres) и пары tomcat'ов. Самое оно чтобы попробовать новую технологию. Такой подход позволял в чем-то эмулировать production окружение и не засорять рабочую машину.

В то время я столкнулся с несколько проблематичным способом инициализации бд из официального postgres образа во время старта контейнера. Тогда все сводилось к тому чтобы написать скрипт, который стартует postgres в single режиме и выполняет нужные sql запросы. Например вот так:

#!/bin/bash

gosu postgres postgres --single < ${INIT_SQL}/create-testdb.sql
gosu postgres postgres --single -j testdb < ${INIT_SQL}/date-db.sql

Затем скрипт и sql файлы надо было добавить в контейнер во время build в папочку /docker-entrypoint-initdb.d/. Пример Dockerfile:

FROM postgres:9

ENV INIT_SQL /init-sql

COPY init-db.sh /docker-entrypoint-initdb.d/
COPY *.sql ${INIT_SQL}/

А далее на старте контейнера запускался docker-entrypoint.sh, который выполнял все скрипты из /docker-entrypoint-initdb.d/.

Это работало, но было очень не удобно. Главная проблема - необходимость запускать postgres в single режиме, так как на момент выполнения postgres еще не был стартован. Из-за этого возникают ограничения в SQL запросах, а также невозможно подложить dump сделанный pg_dump'ом либо подключиться с помощью psql.

Пока я собирался с мыслями чтобы опубликовать вышеописанный метод, docker-entrypoint.sh был переписан. Теперь на время инициализации базы запускается полноценный экземпляр базы, с которым можно взаимодействовать с помощью psql. Также появилась возможность создавать базу и пользователя через определение переменных окружения. Плюс shell скрипт теперь писать не обязательно. Просто складываем sql файлы в /docker-entrypoint-initdb.d/, а они передаются на выполнение в psql. Красотень.

В конце хотел бы отметить, что нынче технологии развиваются и меняются очень быстро. Надо быть все время на чеку. По идее вышеописанные изменения в docker-entrypoint.sh для postgres образа могут привести к вероятным проблемам (особенно если ранее sql скрипты складывали в /docker-entrypoint-initdb.d/ папку), а вот версионирования образов в зависимости от изменения Dockerfile на хабе нету. Отсюда вывод - без своего docker registry никак не обойтись и на внешние образы лучше не надеяться.



Comments

comments powered by Disqus