Команда, в которой я работаю, использует микросервисную организацию в проектах.
У каждого микросервиса свой репозиторий. Каждый микросервис это docker контейнер.
Для среды разработки, чтобы запустить все вместе, мы используем docker-compose.
Кроме того, мы используем концепцию разделения процессов сборки приложения и упаковки контейнера, чтобы не тащить исходные коды и утилиты разработки в контейнеры.
Мы столкнулись с двумя проблемами:
- При первоначальном разворачивании среды разработки, приходится обьяснять программисту, либо писать скрипт инициализации, который склонирует и создаст необходимую иерархию папок из нескольких репозиториев.
- docker-compose не может собрать приложение, а потом упаковать в идижд. он умеет только запускать
docker build.
Для решения этих проблем мы сделали управляющий скрипт docker-project, который оказался очень удобным в работе.
Чем мы и хотим поделиться с open-source сообществом.
Есть другой способ организации проекта, где у каждого микровервиса своя среда разработки и свой docker-compose.yml, в котором он взаимодействует с уже готовыми контейнерами. Нам такая система не подошла, потому что разбив приложение логически на несколько микросервисов, ведется одновременная разработка каждого из них. А поддерживать много похожих docker-compose.yml то еще удовольствие.
docker-compose.yml файл хранится в отдельном проект-репозитории, где также хранятся системные тесты, документация вернего уровня и остальное, что нельзя применить к определенному микросервису, а только к системе в целом.
Что бы не плодить дополнительных конфигов, docker-project расширяет функцинал docker-compose.yml файла, добавляя в него две новые функции:
- Скачивание/обновление исходного кода сервисов из репозиториев
- Запуск указанных команд относительно папок с исходным кодом
Спецификация докер позволяет добавлять метаинформацию в labels в определение контейнера. Лейблы не влияют на работу контейнера, это просто строки, к которым всегда можно получить доступ работая с контейнером.
Пример такого docker-compose.yml:
version: "2" services: users: image: vendor/users expose: - 80 labels: project.git: "https://github.com/vendor/users.git" # ссылка на репозиторий project.git.branch: cool-feature # нужный бранч, по умолчанию - мастер project.build: make # добавляем команду для сборки имиджа web-ui: image: vendor/web-ui ports: - 80:80 labels: project.git: "https://github.com/vendor/web-ui.git" project.build: make # Готовые имиджи используются для сервисов, код которых не приходится менять mysql: image: mysql expose: - 3306
Работа с проектом в этом случае выглядит так:
git clone ... myproject cd myproject docker-project update # клонирует указанные репозитории в структуру apps/{vendor}/{repo} docker-project build # собирает имиджи тем где указана команда build, вполне возможно вам это не нужно docker-compose up # далее обычная работа обычная работа. ... docker-project update # повторный вызов делает git pull #Коммит кода в конкретном репозитории сервиса происходит обычным образом. cd apps/vendor/user git add . git commit -m "...." git push
Внутри docker-project — это просто враппер над git и bash, упрощающий развертывание проекта из нескольких репозиториев, а так же его сборку и других команд, которые надо выполнить над несколькими репозиториями одновременно. Вызов команд идет в интерактивном режиме.
Не забудьте добавить /apps/ в .gitignore
Если внутри сервиса сменить бранч на другой, он таким и останется. Повторный update делает только git pull.
Можно добавлять свои команды.
Например, если определить для сервисов команду test, то можно прогнать юнит тесты у нескольких сервисов одной командой docker-project test.
Вызов docker-project команда. вызовут запуск только у сервисов где эта команда определена.
Посмотреть достпные достпные для данного проекта команды можно вызвав docker-project status
Кроме того docker-project позволяет:
- Ограничить выполнение выбранными сервисами
--app - Запустить произвольную шелл команду в папках с проектом
shell - Добавить в конец выполняемой команды произвольную строку
--extra
Вызов docker-project без параметров показывает шпаргалку по командам:
$ docker-project docker project management tool 0.0.1-alfa Usage: docker-project <command> <arguments> Commands: update - clones or pulls application source shell - uses extra parameter to run shell command for each app status - prints current services with repos and their commands help - prints help your_command - defined as label for the service (example: labels: project.test: make test) Arguments: Full name | Short | Default | Note ------------------------------------------------------- --file -f docker-compose.yml Alternative config file --apps -a apps Applications sources folder --extra -x Extra parameters passed to command
Устанавливается в систему довольно тривиально:
curl -O -L https://github.com/webreactor/docker-project/releases/download/0.0.1-alfa/docker-project chmod a+x docker-project sudo cp docker-project /usr/local/bin/
Либо можно собрать из исходников:
git clone https://github.com/webreactor/docker-project.git cd docker-project make sudo make install
Для работы требуются установленые рнр-cli и git.