Как деплоить проекты с использованием Docker и Docker Compose
Что проверяют
Отличаете ли вы локальный запуск через compose от выкладки на сервер. Интервьюер ждёт, что вы расскажете, откуда берётся образ, как приезжают секреты и что происходит с сервисом во время обновления. Следом спрашивают про откат и простой.
Как отвечать
Опишите схему целиком:
- Dockerfile: многоэтапная сборка на поддерживаемом
python:3.x-slim. Сначала копируются файлы зависимостей и ставятся пакеты, потом код, чтобы слой зависимостей кешировался. Процесс работает под непривилегированным пользователем и запускается черезgunicornилиuvicorn, а не dev-сервером фреймворка; - сборка в CI: образ собирается один раз, тегируется SHA коммита и пушится в registry. Сервер его только скачивает;
- compose на сервере:
image:вместоbuild:,restart: unless-stopped,healthcheck,depends_onсcondition: service_healthyдля базы, именованный volume для данных Postgres, ротация логов черезmax-size; - конфигурация: переменные через
env_fileили секреты, которые не попадают ни в образ, ни в репозиторий; - миграции: отдельным шагом до переключения, например
docker compose run --rm app alembic upgrade head; - выкладка:
docker compose pull, затемdocker compose up -d --wait, снаружи reverse proxy с TLS: Nginx, Caddy или Traefik.
Честно назовите ограничение: compose живёт на одном хосте и при up -d пересоздаёт контейнер, так что короткий простой будет. Без простоя нужны две копии за прокси или оркестратор. Откат это выкладка предыдущего тега.
Где спотыкаются
Переносят в прод локальный compose: bind mount исходников, отладочный сервер, FLASK_ENV=development. Эта переменная к тому же удалена ещё во Flask 2.3 и ничего не делает.
Пишут в начале файла version: '3.8' и запускают старый docker-compose. Поле version устарело и игнорируется, а актуальная команда это плагин docker compose.
Кладут секреты в Dockerfile через ENV или копируют .env в образ. Они остаются в слоях и видны любому, у кого есть доступ к registry.