Недавно наткнулся на отличный инструмент для автоматизации обновления контейнеров - 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 системами или для автоматического обновления сервисов при выходе новых версий образов.