Fork me on GitHub

Июнь 24–25

PyCon Russia 2019

Рус Eng

Александр Кошелев, Яндекс

Сборка Docker образов без build зависимостей

Docker является очень популярным инструментом для развертывания приложения на различной инфраструктуре. Важными факторами эффективности этого процесса являются Docker-образы и их размер. Большие Docker-образы не являются проблемой, но могут замедлить деплой приложений и создают лишнюю нагрузку на инфраструктуру: их надо передавать по сети, распаковывать на хост-машинах и т.д.

Почему Docker-образы получаются большими? Python-проекты обычно собираются из source-пакетов и для этого требуются build-зависимости: компиляторы, библиотеки, заголовочные файлы и другие инструменты. Всё это нужно только для сборки приложения, но не для его работы.

Казалось бы, есть штатный механизм multi-stage builds, который позволяет сначала собрать приложения, а потом уже готовые собранные скопировать на «чистый» базовый образ. Это решает проблему, но не всегда. Поскольку Python-библиотеки часто имеют динамическую линковку с системными библиотеками, то просто скопировать venv недостаточно. Нужно ещё понимать, какие системные библиотеки нужны для работы приложения, иначе оно просто не будет работать корректно.

Я расскажу, как правильно сделать сборку Docker-образов без build-зависимостей, и как решить проблему с системными библиотеками.