Где-то полгода назад по личной инициативе я стал разворачивать компоненты в 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