Pull to refresh

Управление Docker проектом со множеством git репозиториев

Reading time4 min
Views35K

Команда, в которой я работаю, использует микросервисную организацию в проектах.
У каждого микросервиса свой репозиторий. Каждый микросервис это docker контейнер.
Для среды разработки, чтобы запустить все вместе, мы используем docker-compose.


Кроме того, мы используем концепцию разделения процессов сборки приложения и упаковки контейнера, чтобы не тащить исходные коды и утилиты разработки в контейнеры.


Мы столкнулись с двумя проблемами:


  1. При первоначальном разворачивании среды разработки, приходится обьяснять программисту, либо писать скрипт инициализации, который склонирует и создаст необходимую иерархию папок из нескольких репозиториев.
  2. docker-compose не может собрать приложение, а потом упаковать в идижд. он умеет только запускать docker build.

Для решения этих проблем мы сделали управляющий скрипт docker-project, который оказался очень удобным в работе.
Чем мы и хотим поделиться с open-source сообществом.


Есть другой способ организации проекта, где у каждого микровервиса своя среда разработки и свой docker-compose.yml, в котором он взаимодействует с уже готовыми контейнерами. Нам такая система не подошла, потому что разбив приложение логически на несколько микросервисов, ведется одновременная разработка каждого из них. А поддерживать много похожих docker-compose.yml то еще удовольствие.


docker-compose.yml файл хранится в отдельном проект-репозитории, где также хранятся системные тесты, документация вернего уровня и остальное, что нельзя применить к определенному микросервису, а только к системе в целом.


Что бы не плодить дополнительных конфигов, docker-project расширяет функцинал docker-compose.yml файла, добавляя в него две новые функции:


  1. Скачивание/обновление исходного кода сервисов из репозиториев
  2. Запуск указанных команд относительно папок с исходным кодом

Спецификация докер позволяет добавлять метаинформацию в 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.

Tags:
Hubs:
+17
Comments40

Articles