Главная/Материалы/Материал

Рабочие примеры

Запускаемые проекты, на которые ссылаются уроки курса. Каждый каталог самодостаточен: содержит Dockerfile, исходники, зависимости и README.md с командами запуска и проверками.

Все примеры собираются и запускаются без восстановления пропущенных частей. Единственное исключение отмечено явно: multistage-uv требует однократного make lock — это обычный шаг рабочего процесса uv, описанный в его README.md.


Состав

ПримерЧто демонстрируетУрок
hello-pythonМинимальный корректный образ: PYTHONUNBUFFERED, exec form, обработчик SIGTERM, non-root6.3
python-cliCLI: ENTRYPOINT + CMD, коды возврата, stdin, разделение stdout и stderr6.8, проект 1
multistage-uvСборка через uv: lock-файл, cache mount, образ без uv и исходников6.2, 6.3
flask-basicFlask под Gunicorn: worker-процессы, логи в stdout, graceful timeout6.9
fastapi-basicFastAPI под python -m uvicorn: lifespan, раздельные пробы, JSON-логи6.10, проект 2
worker-redisBackground worker: graceful shutdown, зависимость по готовности6.11, 9.7
pytest-containerТесты как стадия сборки, порог покрытия, параллельный линтер6.12, 15.2
compose-stackМногокомпонентный стек: сети, тома, зависимости по готовности9.7
production-fastapiТри пробы, JSON-логи, мягкое завершение, проверка конфигурации при стартераздел 11, проект 2
local-registryRegistry как HTTP-хранилище: digest, дедупликация, удаление, сборка мусорараздел 14
ci-pipelineКонвейер со скриптами вместо YAML, три кода возврата, развёртывание по digestраздел 16, проект 4
debug-scenariosШесть сломанных конфигураций, воспроизводящих симптомыdebugging challenges

Измеренные размеры образов

Собраны и измерены на Docker 29.7.1 (2026-08-04):

ПримерРазмер
compose-stack73 MB
fastapi-basic66 MB
production-fastapi66 MB
pytest-container45 MB
python-cli45 MB
flask-basic44 MB
worker-redis43 MB
hello-python41 MB
local-registry41 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 100016.7
PYTHONUNBUFFERED=1 — вывод сразу в docker logs6.4
exec form в CMD и ENTRYPOINT — приложение является PID 15.4
Обработчик SIGTERM — завершение за доли секунды, код 04.4
Зависимости устанавливаются до копирования кода5.5
.dockerignore исключает .git, .venv, кэш и секреты5.1
Версии зависимостей закреплены5.9
Директива # syntax=docker/dockerfile:1 при использовании --mount5.6

Версии

Зафиксированы и проверены по официальным источникам на 30 июля 2026 года.

КомпонентВерсияИсточник
Python3.13-slimDocker Hub
uv0.12.0docs.astral.sh
FastAPI0.141.1PyPI
Flask3.1.3PyPI
Gunicorn26.0.0PyPI
pydantic2.13.4PyPI
redis (клиент)8.1.0PyPI
Redis (образ)8-alpineDocker Hub
pytest9.1.1PyPI
pytest-cov7.1.0PyPI
ruff0.16.0PyPI

Курс использует Python 3.13, а не 3.14: третьи зависимости с бинарными расширениями обычно получают колёса для новой минорной версии с задержкой. Критерии выбора версии разбираются в уроке 6.1.


Быстрая проверка всех примеров

bash
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:

bash
make -C multistage-uv lock build

Уборка:

bash
docker rmi -f $(docker images -q --filter 'reference=example-*') 2>/dev/null

Навигация

Вернуться к главному оглавлению
Раздел 06. Python внутри Container
Официальные источники

Markdown на GitHub ↗