Рабочие примеры
Запускаемые проекты, на которые ссылаются уроки курса. Каждый каталог самодостаточен: содержит Dockerfile, исходники, зависимости и README.md с командами запуска и проверками.
Все примеры собираются и запускаются без восстановления пропущенных частей. Единственное исключение отмечено явно: multistage-uv требует однократного make lock — это обычный шаг рабочего процесса uv, описанный в его README.md.
Состав
| Пример | Что демонстрирует | Урок |
|---|---|---|
hello-python | Минимальный корректный образ: PYTHONUNBUFFERED, exec form, обработчик SIGTERM, non-root | 6.3 |
python-cli | CLI: ENTRYPOINT + CMD, коды возврата, stdin, разделение stdout и stderr | 6.8, проект 1 |
multistage-uv | Сборка через uv: lock-файл, cache mount, образ без uv и исходников | 6.2, 6.3 |
flask-basic | Flask под Gunicorn: worker-процессы, логи в stdout, graceful timeout | 6.9 |
fastapi-basic | FastAPI под python -m uvicorn: lifespan, раздельные пробы, JSON-логи | 6.10, проект 2 |
worker-redis | Background worker: graceful shutdown, зависимость по готовности | 6.11, 9.7 |
pytest-container | Тесты как стадия сборки, порог покрытия, параллельный линтер | 6.12, 15.2 |
compose-stack | Многокомпонентный стек: сети, тома, зависимости по готовности | 9.7 |
production-fastapi | Три пробы, JSON-логи, мягкое завершение, проверка конфигурации при старте | раздел 11, проект 2 |
local-registry | Registry как HTTP-хранилище: digest, дедупликация, удаление, сборка мусора | раздел 14 |
ci-pipeline | Конвейер со скриптами вместо YAML, три кода возврата, развёртывание по digest | раздел 16, проект 4 |
debug-scenarios | Шесть сломанных конфигураций, воспроизводящих симптомы | debugging challenges |
Измеренные размеры образов
Собраны и измерены на Docker 29.7.1 (2026-08-04):
| Пример | Размер |
|---|---|
compose-stack | 73 MB |
fastapi-basic | 66 MB |
production-fastapi | 66 MB |
pytest-container | 45 MB |
python-cli | 45 MB |
flask-basic | 44 MB |
worker-redis | 43 MB |
hello-python | 41 MB |
local-registry | 41 MB |
ci-pipeline | собирается |
multistage-uv требует однократного make lock — это описано в его README. У debug-scenarios общего Dockerfile нет: он держит по одному на сценарий.
Все образы запускаются от 10001:10001.
Отдельно про четыре последних примера.
production-fastapi,local-registry,ci-pipelineиdebug-scenariosнаписаны на машине без установленного Docker. В них проверено то, что проверяется без него: Python-код прогнан тестами, скрипты —bash -nи запуском на пути «инструмента нет», конфигурации разобраны. Сборка образов и запуск container'ов не выполнялись; вREADMEкаждого примера это указано явно с перечнем того, что осталось непроверенным.
Общие соглашения
Все примеры следуют одним правилам — они же являются требованиями курса к production-образу:
| Правило | Где проверяется |
|---|---|
Непривилегированный пользователь с фиксированным UID 10001 | 6.7 |
PYTHONUNBUFFERED=1 — вывод сразу в docker logs | 6.4 |
exec form в CMD и ENTRYPOINT — приложение является PID 1 | 5.4 |
Обработчик SIGTERM — завершение за доли секунды, код 0 | 4.4 |
| Зависимости устанавливаются до копирования кода | 5.5 |
.dockerignore исключает .git, .venv, кэш и секреты | 5.1 |
| Версии зависимостей закреплены | 5.9 |
Директива # syntax=docker/dockerfile:1 при использовании --mount | 5.6 |
Версии
Зафиксированы и проверены по официальным источникам на 30 июля 2026 года.
| Компонент | Версия | Источник |
|---|---|---|
| Python | 3.13-slim | Docker Hub |
| uv | 0.12.0 | docs.astral.sh |
| FastAPI | 0.141.1 | PyPI |
| Flask | 3.1.3 | PyPI |
| Gunicorn | 26.0.0 | PyPI |
| pydantic | 2.13.4 | PyPI |
| redis (клиент) | 8.1.0 | PyPI |
| Redis (образ) | 8-alpine | Docker Hub |
| pytest | 9.1.1 | PyPI |
| pytest-cov | 7.1.0 | PyPI |
| ruff | 0.16.0 | PyPI |
Курс использует Python 3.13, а не 3.14: третьи зависимости с бинарными расширениями обычно получают колёса для новой минорной версии с задержкой. Критерии выбора версии разбираются в уроке 6.1.
Быстрая проверка всех примеров
cd resources/examples
for d in hello-python python-cli flask-basic fastapi-basic worker-redis pytest-container; do
printf '%-20s ' "$d"
if docker build -q -t "example-$d" "$d" > /dev/null 2>&1; then
echo "собран"
else
echo "ОШИБКА СБОРКИ"
fi
done
multistage-uv проверяется отдельно, после make lock:
make -C multistage-uv lock build
Уборка:
docker rmi -f $(docker images -q --filter 'reference=example-*') 2>/dev/null
Навигация
Вернуться к главному оглавлению
Раздел 06. Python внутри Container
Официальные источники