Дон; 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 МБ), але є найбільш часто змінюваною її частиною.

Тож код, який зазвичай змінюється для нового випуску, становить лише кілька МБ. І все-таки ми копіюємо всі залежності та ресурси знову і знову в кожному артефакті. Це втрата місця, пропускної здатності та часу.