Запуск postgres 9.5 и django в одном контейнере для CI (Bamboo) - PullRequest
0 голосов
/ 22 мая 2019

Я пытаюсь настроить задание CI на Bamboo для приложения Django, тесты для запуска основаны на базе данных (postgres 9.5). Кажется, что разумный способ сделать это - запустить весь тест в контейнере Docker, поскольку я не контролирую среду агента, поэтому не могу установить Postgres там.

Большинство руководств, которые я нашел, рекомендуют запускать postgres и django в двух отдельных контейнерах и использовать docker-compose для простого управления ими. В этом сценарии каждый образ докера запускает только один сервис, запущенный с CMD. В Bamboo я не могу использовать docker-compose, однако мне нужно использовать только одно изображение, поэтому я пытаюсь заставить Postgres и Django прекрасно работать вместе в одном контейнере, но пока без особого успеха.

Моя проблема в том, что я не вижу простого способа запустить Postgres как службу внутри докера, но НЕ как команду CMD докера , официальное изображение postgre использует подход entrypoint.sh, также описано в официальных документах docker Но мне не понятно, как это реализовать. Буду признателен за вашу помощь!

Ответы [ 2 ]

1 голос
/ 01 июня 2019

Ну, в общем, вы бы запустили postgres как фоновый процесс в сценарии оболочки docker-entrypoint, который в противном случае запустит ваше приложение django.

Единственный трюк здесь заключается в том, что вам нужно поместить команду 'trap'в нем, чтобы вы могли отправить завершение / уничтожение фоновому процессу, когда ваш главный процесс остановится.

Хотя я делал это тысячу раз, я знаю, что это хороший источник ошибок программирования.В общем, я просто использую мою docker-systemctl-replace , которая заботится о запуске нескольких приложений в качестве сервисов, как если бы контейнер представлял собой виртуальную машину, на которой размещено несколько приложений.

0 голосов
/ 31 мая 2019

Ваш единственный вариант - добавить скрипт запуска в Dockerfile или запустить его как часть ваших docker run ... команд. Обычно мы не используем задачи «Docker», так как я нахожу их ... неприятными (также почему я обычно просто возвращаюсь к выполнению задачи «Сценарий» и напрямую вызываю docker run в этом сценарий задачи)

В любом случае, вам нужно, чтобы ваш контейнер Docker выполнял скрипт, который бы:

  1. Запуск Postgres (например, sudo systemctl start postgresql)
  2. Выполните ваши тесты.

Ваш Dockerfile должен будет установить Postgresql и выполнить небольшую работу по настройке, которую я себе представляю (например, создать соответствующих пользователей и базы данных с соответствующим владельцем). Поскольку мы все хорошие граждане, мы не забываем никогда не запускать ваши контейнеры как root, верно?

Примечание. Вы всегда можете взломать два контейнера для общения друг с другом, не используя docker-compose. Это немного менее удобно, но вы можете сделать что-то вроде:

docker run --detach --cidfile=db_cidfile --name ci_db postgresql_image
...
docker run --link ci_db testing_image

Убедитесь, что у вас EXPOSE правильные порты на образе postgresql для контейнера testing_image.

РЕДАКТИРОВАТЬ: я смотрю больше на мой конкретный случай - мы просто устанавливаем Postgresql на базовый хост CentOS, а не используем образ по умолчанию postgresql (используя yum install http://yum.postgresql.org/..../pgdg-centos...rpm, а затем просто устанавливаем пакеты postgresql-server и postgresql-contrib оттуда ). В нашем Dockerfile тоже есть CMD [ "/usr/pgsql-ver/bin/postgres", "-D", "/var/lib/pgsql/ver/data"]. Мы не делаем ничего необычного с док-контейнером. ПРИМЕЧАНИЕ : мы вообще не используем это в производстве, это строго для локального тестирования и тестирования CI.

...