1.9Kпросмотров
75.9%от подписчиков
9 марта 2026 г.
questionScore: 2.1K
А вы используете Docker multi-stage builds? Я полдня готовил пример с multi-stage сборкой Docker образа для запуска Python приложения на примере FastAPI бекенда в виде uv package:
- ковырял официальные примеры от astral в доке и на гитхабе;
- подтыкал разные переменные окружения для uv;
- брал python из официального образа на docker hub, скачивал готовую сборку через uv;
- делал и через один образ и через multi-stage;
- собирал на классическом debian и использовал гугловый distroless;
- в процессе изучал содержимое через dive, чтобы проанализировать скопированное в контейнер... И чет мне теперь это кажется лютой экономией на спичках. Вероятно, такой подход актуален для приложений, которые собираются в бинарь — тот же Go. Может быть, для Python-приложений оно и не надо? У меня для супер базового приложения пакеты могут весить 80-150 мегабайт(!) в зависимости от настроек. Сам питон весит сотню мегабайт.
Смешно на фоне этого всего видеть сорсы простого приложения: 20-40 килобайт. А люди иногда зачем-то экономят и не ставят переносы, где те уже напрашиваются 😁 Плюс тудым-сюдым, и вот выходит контейнер на 300 мегабайт, и никакой дистролесс тут от этого не спасает — он же на самом деле нужен для безопасности, чтобы не было возможности запустить что-либо кроме основного приложения. Там специально всё-всё выпилено. Да, в debian slim сборках есть некоторые бинари, которые формально нам и не нужны вовсе, и можно без них. Но на фоне сотен мегабайт, какие-то 20-30 мегабайт вообще ни о чем будто бы. Реальная польза заметна, если через .dockerignore исключить из образа кэш от всяких инструментов: mypy, ruff, pytest, coverage, etc. Тут легко срезать сотню мегабайт. Но вы же и так используете игнор-файлы, да? Правда используете? Включаете ли компиляцию байткода на этапе сборки? Или готовы подождать пару секунд при старте контейнера, чтобы всё скомпилировалось на месте? Зато несколько десятков мегабайт можно сэкономить. А вы собираете питон приложения в multi-stage? Ставьте 🐳 если да
Ставьте 👾 если нет Ну и в итоге-то.. нужно ли видео на эту тему? Тут как обычно: если подробно всё рассказывать, как я люблю, то это час-полтора материала. Чтобы объяснить, почему делаем именно так. Если надо, ставьте 🔥