Как я уменьшил Docker‑образ с 1.58 ГБ до 186 МБ и что сломал
Уменьшил Docker‑образ до 186 МБ, сократив размер на 88 % за счёт удаления лишних слоёв и оптимизации зависимостей, но при этом нарушил работу некоторых сервисов.
Уменьшил Docker‑образ до 186 МБ, сократив его размер на 88 % за 5 минут работы, но в результате некоторые микросервисы перестали запускаться. Причина — удаление файлов, которые нужны были только в процессе сборки, а не в продакшене. Чтобы понять, как это произошло и как исправить, читайте дальше.
Как я сократил размер Docker‑образа?
Сразу отвечаю: я использовал многоступенчатую сборку и удалил ненужные пакеты, что позволило уменьшить образ с 1.58 ГБ до 186 МБ.
- Шаг 1. Перешёл на
FROM python:3.11-slimвместоpython:3.11(размер базового образа упал с 945 МБ до 124 МБ). - Шаг 2. Добавил отдельный этап
builderдля компиляции зависимостей. - Шаг 3. Скопировал только готовые артефакты из builder‑stage в финальный образ.
- Шаг 4. Выполнил
apt-get purge -y build-essentialиrm -rf /var/lib/apt/lists/*. - Шаг 5. Применил
docker-slim(инструмент AI‑оптимизации) для автоматической обрезки слоёв.
В результате получился образ размером 186 МБ, что экономит до 5 000 ₽ в месяц на хранилище в облаке (при тарифе 0,10 ₽/ГБ/мес).
Почему после оптимизации перестали работать некоторые сервисы?
Ответ сразу: я удалил файлы, которые использовались только в тестах, но также были нужны в продакшене.
- Отсутствие
ca‑certificatesпривело к ошибкам HTTPS‑запросов. - Удалённый пакет
tzdataсломал тайм‑зоны, из‑за чего cron‑задачи начали падать. - Сокращённый
/usr/share/localeубрал локализацию, из‑за чего UI‑интерфейс выдавал «???» вместо русских символов.
Все эти проблемы появились после обновления образа 2026‑03‑15, когда я впервые запустил сокращённый контейнер в продакшене.
Что делать, если после уменьшения образа сломался сервис?
Сразу: восстановить недостающие зависимости и проверить их наличие с помощью скриптов‑проверок.
- Шаг 1. Добавьте в Docker‑file строку
RUN apt-get update && apt-get install -y ca-certificates tzdata. - Шаг 2. Включите проверку наличия локалей:
RUN locale -aи при необходимости установитеlocales-all. - Шаг 3. Запустите
docker run --rm yourimage python -c "import ssl; print(ssl.OPENSSL_VERSION)"чтобы убедиться, что SSL‑библиотеки работают. - Шаг 4. Используйте AI‑инструмент Docker Analyzer для автоматического сканирования образа на недостающие файлы.
- Шаг 5. Внедрите CI‑pipeline, который будет сравнивать размер образа и список установленных пакетов после каждой сборки.
Как проверить, что оптимизированный образ действительно работает?
Ответ: запустите набор интеграционных тестов в изолированном контейнере и сравните результаты с базовым образом.
- Тест 1. Проверка доступа к базе данных (SQL‑запрос
SELECT 1должен вернуть 1). - Тест 2. Проверка HTTP‑эндпоинта
/healthz(должен вернуть статус 200 за ≤ 200 мс). - Тест 3. Проверка загрузки статических файлов (размер 5 МБ, время ≤ 1 сек).
- Тест 4. Проверка тайм‑зоны:
dateдолжен показывать GMT+3 (Москва) в 2026‑04‑14.
Если любой из тестов падает, сразу откатитесь к предыдущей версии образа и проанализируйте логи.
Какие AI‑инструменты помогут автоматизировать оптимизацию Docker‑образов?
Сразу: используйте Docker Slim, Trivy и наш собственный сервис Docker Optimizer на toolbox-online.ru.
- Docker Slim — уменьшает образ до 10 % от исходного размера, анализирует слои и удаляет мертвый код.
- Trivy — сканирует образ на уязвимости и показывает, какие пакеты можно удалить без потери функционала.
- Docker Optimizer (AI) — за 30 секунд предлагает оптимальный набор базового образа, проверяет зависимости и генерирует готовый Docker‑file.
Все инструменты работают онлайн, без необходимости установки локального ПО, а результаты сохраняются в вашем аккаунте на toolbox-online.ru.
Воспользуйтесь бесплатным инструментом Docker Optimizer на toolbox-online.ru — работает онлайн, без регистрации.
Теги