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