Где-то полгода назад по личной инициативе я стал разворачивать компоненты в docker контейнерах для разработки и тестирования продуктов. При этом самая сложная система состояла из базы данных (postgres) и пары tomcat’ов. Самое оно чтобы попробовать новую технологию. Такой подход позволял в чем-то эмулировать production окружение и не засорять рабочую машину.
Info
Заметка из 2015-го года! Ранее была опубликована в старом блоге.
В то время я столкнулся с несколько проблематичным способом инициализации бд из официального 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 никак не обойтись и на внешние образы лучше не надеяться.