14 января 2025 г. в 21:04
Composehook - автоматическое обновление Docker Compose сервисов через webhook

Недавно наткнулся на отличный инструмент для автоматизации обновления контейнеров - composehook. Это простое но элегантное решение, которое позволяет настроить webhook для автоматического обновления сервисов в Docker Compose проектах.

Как это работает

Принцип работы довольно прост - composehook запускается как отдельный контейнер и слушает HTTP запросы. При получении POST-запроса на endpoint вида http://localhost:8537/<project>/<service>, он находит указанный проект и сервис, проверяет наличие специального label'а и выполняет обновление контейнера.

Настройка

Для установки достаточно добавить сервис composehook в ваш docker-compose.yaml:

services:
  composehook:
    image: codeberg.org/tippfehlr/composehook
    ports:
      - 8537:8537
    volumes:
      - /var/run/docker.sock:/var/run/docker.sock
      - /путь/к/папке/с/проектами:/compose
    environment:
      - TIMEOUT=10
    restart: always

Важный момент - в volume нужно указать путь к директории, где лежат ваши Docker Compose проекты. Структура должна быть следующей:

/путь/к/папке/с/проектами/
  проект1/
    compose.yaml
  проект2/
    compose.yaml

Чтобы включить возможность обновления через webhook для конкретного сервиса, нужно добавить специальный label:

services:
  мой-сервис:
    image: мой-образ
    labels:
      composehook.update: true

Особенности использования

В процессе настройки столкнулся с парой нюансов, о которых стоит упомянуть:

1. Если в compose.yaml присутствует строка version:, webhook может возвращать ошибку 404. Это происходит из-за того, что команда проверки наличия проекта выдает предупреждение:

WARN[0000] /opt/stacks/project/compose.yaml: `version` is obsolete

Решение простое - удалить эту строку, так как она действительно больше не используется в новых версиях Docker Compose.

2. При работе с приватными репозиториями нужно предоставить доступ к учетным данным Docker. Это делается добавлением дополнительного volume:

services:
  composehook:
    volumes:
      - ~/.docker/config.json:/root/.docker/config.json:ro

Как это работает

При получении webhook-запроса, composehook выполняет следующие действия:

1. Проверяет, не нарушает ли запрос установленный timeout

2. Ищет указанный сервис в проекте

3. Проверяет наличие label'а composehook.update

4. Подтягивает последний образ

5. Пересоздает контейнер

HTTP-коды ответа помогают понять, что произошло:

- 200: Успешное обновление

- 400: Отсутствует необходимый label

- 404: Проект или сервис не найден

- 409: Обновление заблокировано таймаутом или уже выполняется

- 500: Ошибка выполнения команд

В целом, composehook - это простой и надежный инструмент для автоматизации обновления контейнеров. Особенно удобен в связке с CI/CD системами или для автоматического обновления сервисов при выходе новых версий образов.