Слои и их влияние на размер и скорость
Вопрос
Как устроены слои образа и как это влияет на размер образа, скорость сборки и деплоя?
Попробуйте сами
Ответьте вслух за 2 минуты, как на собесе. Потом сверьтесь с тезисами: что прозвучало, а что нет.
Показать ответ и разбор
Коротко
Что должно прозвучать в ответе
Каждая инструкция, меняющая ФС (`RUN`, `COPY`, `ADD`), создаёт слой с разницей относительно предыдущего
Слои неизменяемы и адресуются хешем, общие слои хранятся и скачиваются один раз
Удаление в следующем слое не уменьшает образ, чистить надо в той же инструкции
Кеш сборки: при изменении слоя пересобираются все последующие, поэтому редко меняющееся кладут выше
При деплое скачиваются только отсутствующие на узле слои
Multi-stage и маленькие базовые образы уменьшают итог
Что могут спросить следом
- Почему
COPY . .перед установкой зависимостей замедляет сборку? - Как посмотреть, какой слой самый тяжёлый?
Разбор
Образ это стопка слоёв. Инструкции, которые меняют файловую систему, RUN, COPY, ADD, создают новый слой, где записана только разница. Слои неизменяемы и адресуются хешем содержимого, поэтому одинаковые слои хранятся на узле один раз и делятся между образами. Отсюда три следствия. Размер: удалить файл, добавленный в прошлом слое, нельзя, он останется в истории, поэтому скачивание, распаковку и чистку делают в одной инструкции или выносят в отдельную стадию multi-stage. Скорость сборки: кеш работает послойно, и при изменении слоя пересобираются все последующие, поэтому сначала копируют манифесты зависимостей и ставят их, а код копируют в самом конце. Скорость деплоя: узел скачивает только отсутствующие слои, и если базовый образ и зависимости не менялись, приедет лишь тонкий слой с кодом. Тяжёлые слои видно в docker history, а подробно в утилите dive.
Ответьте сами, а не прочитайте
В тренажёре вопрос попадёт в повторения и вернётся, когда начнёт забываться. Плюс билеты с зачётом: 20 вопросов, не больше 2 ошибок.