Обсуждение: Постргис в докере
я тут начал копаться с docker беру docker postgresql:version запускаю сервисом затем запускаю свои CI-скрипты в них делается условный make create_or_update_db test то есть сперва накатываем структуру/данные в Pg в докере а потом пускаем на нем тесты. все бы ничего, но миграций скопилось довольно много и сейчас создание просто структуры БД для тестов занимает где-то 15 минут. что хочу: хочу докер, желательно прямой наследник от постгрисовых докеров с Pg у которого БД чем-то заполнена. причем заполнение чтобы осуществлялось через коннект/протокол. то есть идеально бы прийти к схеме: 1. берем docker, например postgresq:9.5 2. запускаем 3. из другого докера коннектим к нему и заполняем данными (потому что инфраструктура наполнения данными и слежения за миграциями большая и отдельная, расчитанная на продакшены итп) 4. каким-то образом фиксируем состояние постгриса в докере с новым именем 5. дальше пользуемся результатом на пункте 4 вместо postgresql:9.5 Вопрос: как можно просто реализовать пункт 4? -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
Вложения
Добрый день
Монтируйте том с данными снаружи в контейнер - заряжайте в него свои данные.
После первоначального наполнения копируйте по необходимости в CI pipeline.
2018-08-02 14:33 GMT+05:00 Dmitry E. Oboukhov <unera@debian.org>:
я тут начал копаться с docker
беру docker postgresql:version
запускаю сервисом
затем запускаю свои CI-скрипты
в них делается условный
make create_or_update_db test
то есть сперва накатываем структуру/данные в Pg в докере а потом
пускаем на нем тесты.
все бы ничего, но миграций скопилось довольно много и сейчас создание
просто структуры БД для тестов занимает где-то 15 минут.
что хочу:
хочу докер, желательно прямой наследник от постгрисовых докеров с Pg у
которого БД чем-то заполнена.
причем заполнение чтобы осуществлялось через коннект/протокол.
то есть идеально бы прийти к схеме:
1. берем docker, например postgresq:9.5
2. запускаем
3. из другого докера коннектим к нему и заполняем данными (потому что
инфраструктура наполнения данными и слежения за миграциями большая и
отдельная, расчитанная на продакшены итп)
4. каким-то образом фиксируем состояние постгриса в докере с новым именем
5. дальше пользуемся результатом на пункте 4 вместо postgresql:9.5
Вопрос: как можно просто реализовать пункт 4?
--
. ''`. Dmitry E. Oboukhov <unera@debian.org>
: :’ :
`. `~’ GPG key: 4096R/08EEA756 2014-08-30
`- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
Все просто: Создается свой собственный docker-image с предопределенной базой данных. Копируем оригинальный docker-image который опубликован для постгреса. И в конце RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 5432 CMD ["postgres"] Меняешь на что-то такое: RUN ln -s usr/local/bin/docker-entrypoint.sh / # backwards compat RUN docker-entrypoint.sh && sleep 1000 && make create_or_update_db test ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 5432 CMD ["postgres"] По-идее должно сработать и простое наследование FROM postgresql:version RUN docker-entrypoint.sh && sleep 1000 && make create_or_update_db test ENTRYPOINT ["docker-entrypoint.sh"] EXPOSE 5432 CMD ["postgres"] И сохраняшешь получившийся контейнер. Тегаешь и отправляешь в свой репозиторий. Потом просто: FROM mytestingpostgresql:latest RUN make additional_db_modification Как-то так -----Original Message----- From: Dmitry E. Oboukhov <unera@debian.org> Sent: Thursday, August 2, 2018 12:34 PM To: pgsql-ru-general@lists.postgresql.org Subject: Постргис в докере я тут начал копаться с docker беру docker postgresql:version запускаю сервисом затем запускаю свои CI-скрипты в них делается условный make create_or_update_db test то есть сперва накатываем структуру/данные в Pg в докере а потом пускаем на нем тесты. все бы ничего, но миграций скопилось довольно много и сейчас создание просто структуры БД для тестов занимает где-то 15 минут. что хочу: хочу докер, желательно прямой наследник от постгрисовых докеров с Pg у которого БД чем-то заполнена. причем заполнение чтобы осуществлялось через коннект/протокол. то есть идеально бы прийти к схеме: 1. берем docker, например postgresq:9.5 2. запускаем 3. из другого докера коннектим к нему и заполняем данными (потому что инфраструктура наполнения данными и слежения за миграциямибольшая и отдельная, расчитанная на продакшены итп) 4. каким-то образом фиксируем состояние постгриса в докерес новым именем 5. дальше пользуемся результатом на пункте 4 вместо postgresql:9.5 Вопрос: как можно просто реализовать пункт 4? -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756
> ENTRYPOINT ["docker-entrypoint.sh"] > EXPOSE 5432 > CMD ["postgres"] > По-идее должно сработать и простое наследование проблема в том что make create_or_update_db - не может быть запущено в окружении образа (даже отнаследованного) postgresql:version я сейчас копаюсь с вот такой фигней 1. запускаю postgresql:version с указанием --name 2. запускаю докер с make create_or_update_db и делаю --link по name между ними 3. указание --name получается как бы расшаривает один pg между множеством докеров-тестов и create_or_update_db у них на все один в name включил sha256 от версии из create_or_update_db: таким образом изменения в инфраструктуре Pg рождают новый контейнер-докер все в целом ок, но есть пара проблем 1. когда два докера выполняют один create_or_update_db параллельно и соревнуются друг с дружкой 2. при естественной миграции вперед по версиям копятся запущенные постгрисы хотел как-то сюда приспособить docker commit, но пока не получается валидно его перезапустить. вот имеем docker postgres:version в него нафигачили данных через сеть. далее делаем на него docker commit, вроде все ок. а вот новый run на уже закоммиченный как правильно сделать? -- . ''`. Dmitry E. Oboukhov <unera@debian.org> : :’ : `. `~’ GPG key: 4096R/08EEA756 2014-08-30 `- 71ED ACFC 6801 0DD9 1AD1 9B86 8D1F 969A 08EE A756