Команда, в которой я работаю, использует микросервисную организацию в проектах.
У каждого микросервиса свой репозиторий. Каждый микросервис это 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.
Автор: ecto