Дон; t Помістіть жирові банки в Docker Images
Опубліковано 14 жовтня 2019 р. Оновлено 10 червня 2020 р
Покласти банку з жиром у контейнер Docker - це марні витрати на зберігання, пропускну здатність та час. На щастя, ми можемо використати шарування зображень та кешування реєстру для створення додаткових збірок та дуже малих артефактів. Наприклад, ми могли б зменшити фактичний розмір нових артефактів з 75 МБ до лише одного МБ! І найкраще те, що є плагін для Maven і Gradle, який обробляє все за нас.

- Жирна банка містить усі залежності, які зазвичай не змінюються між випусками. Але ці залежності копіюються знову і знову в кожну жирову банку, що призводить до втрати місця, пропускної здатності та часу.
- Наприклад, баночка нашого додатка Spring Boot була 72 Мб, але містила лише 2 МБ коду. Зазвичай код є єдиною частиною, яку змінили.
- На щастя, ми можемо використати шарування зображень Docker: розмістивши залежності та ресурси в різних шарах, ми можемо використовувати їх повторно і лише оновити код для кожного артефакту/випуску.
- Jib надає простий у використанні плагін для Maven та Gradle для реалізації цього підходу. Не потрібно писати файл Docker вручну.
Механізм шару Docker потужний. Якщо всі ваші програми використовують одне і те ж базове зображення (наприклад, openjdk: 11.0.4-jre-slim), Docker повторно використовує шари ОС та JRE. Таким чином, ми економимо пам’ять у реєстрі Docker і пришвидшуємо завантаження та завантаження з реєстру, оскільки потрібно передавати менше МБ (Docker передає лише нові рівні до реєстру).
На жаль, багато додатків не використовують цей потужний механізм повністю, оскільки вони використовують жирові банки в контейнері Docker.
Кожен новий випуск створює новий рівень Docker розміром 72 МБ
Припустимо, наш додаток Spring Boot упакований у жирову банку. Ця жирова баночка розміром 72 Мб і додана в останньому рядку файлу Docker. Це означає, що кожен новий випуск займе 72 Мб пам’яті, а 72 Мб потрібно завантажувати та завантажувати з реєстру.
Тепер важливо уважніше розглянути ці 72 МБ:
Вміст жирної банки. Більшість його вмісту змінюється рідко, але він копіюється знову і знову в кожен артефакт.
Баночка містить три частини:
- Залежності: Використані бібліотеки займають більшу частину розміру, але вони змінюються рідко. Більшу частину часу, коли ми створюємо випуск, ми торкалися лише нашого коду, а не залежностей. Проте залежності копіюються в кожен випуск.
- Ресурси: В основному, тут та сама проблема. Хоча ресурси (HTML, CSS, зображення, файли конфігурації тощо) змінюються частіше, ніж залежності, вони все одно змінюються не так часто, як змінюється код. Але вони також дублюються в кожному випуску.
- Код: Код містить лише невелику частку від загального розміру жирової банки (300 КБ - 2 МБ), але є найбільш часто змінюваною її частиною.
Тож код, який зазвичай змінюється для нового випуску, становить лише кілька МБ. І все-таки ми копіюємо всі залежності та ресурси знову і знову в кожному артефакті. Це втрата місця, пропускної здатності та часу.