Как деплоить docker-контейнер без простоя?
Что имеем: 2 docker-контейнера: app (node.js) и nginx (reverse-proxy)
Требование: Иметь минимальный простой сервиса. Некоторые запросы могут выполняться долгое время. Важно вернуть ответ на запрос, который пришел до деплоя.
Суть проблемы: При обновлении проекта (docker-compose build && docker-compose up -d) имеем простой 5-10сек. (время запуска node.js в контейнере app).
Как я себе представляю решение:
- Использование Green/Blue паттерна. Не смог найти простого решения (без костылей)
- Стек Docker Swarm
Подскажите максимально простой подход к деплою с нулевый простоем (при отсутсвии DevOps'a).
docker-compose.yml
services:
app:
build:
context: .
restart: unless-stopped
env_file: .env
nginx:
build: ./docker/nginx
restart: unless-stopped
depends_on:
- app
ports:
- ${APP_PORT}:80
volumes:
- ./static:/var/www:cached
Ответы (1 шт):
Сама идея с тем, чтобы вернуть ответ на запрос, который пришел до начала деплоя является крайне утопической, так как во время деплоя останавливается процесс, который этот запрос обслуживал, а также уничтожается TCP соединение (и сессия TLS), которые этот запрос обслуживали. Восстановить эту парочку не получится.
Можно изобрести жуткие костыли с реверсивным прокси (решает проблему с соединением и сессией) и насочинять транзакционную модель отправки ответа клиенту, но это будет очень усложнено.
Более технологичный ответ - это интернет, детка - запрос всегда может отвалиться просто потому, что данные идут через интернет. Клиенты должны это учитывать и посылать запрос повторно, если с первым не сложилось.