Что происходит во время выполнения команды docker build?

«Что происходит во время выполнения команды docker build?» — вопрос из категории Devops, который задают на 10% собеседований Python Разработчик. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Команда docker build создает Docker-образ на основе инструкций из Dockerfile и файлов в контексте сборки.

Процесс сборки по шагам:

  1. Отправка контекста: Клиент Docker упаковывает все файлы и папки из указанного пути (например, .) в tar-архив и отправляет его демону Docker. Файлы, указанные в .dockerignore, исключаются.
  2. Чтение Dockerfile: Демон Docker последовательно выполняет каждую инструкцию из Dockerfile.
  3. Создание слоев: Каждая инструкция (RUN, COPY, ADD) создает новый слой образа. Слой — это, по сути, файловая система с изменениями, внесенными инструкцией.
  4. Использование кэша: Перед выполнением инструкции Docker проверяет, не выполнялась ли точно такая же инструкция ранее для этого же базового слоя. Если да, то существующий слой берется из кэша, что значительно ускоряет сборку.
  5. Финализация: После выполнения всех инструкций создается финальный образ, который является объединением всех слоев. Ему присваивается указанный тег.

Ключевые концепции:

  • Слои (Layers): Образы Docker состоят из набора слоев, доступных только для чтения. Это делает их легковесными и позволяет переиспользовать общие слои между разными образами.
  • Кэширование: Кэш для слоя сбрасывается (инвалидируется), если изменилась сама инструкция в Dockerfile или изменился файл, который копируется командой COPY или ADD. Все последующие слои также будут пересобраны.
  • Контекст сборки (Build Context): Это набор файлов, доступных для команд COPY и ADD внутри Dockerfile. Важно поддерживать контекст минимальным с помощью .dockerignore для ускорения сборки и уменьшения размера образа.

Пример команды:

# Собрать образ с тегом 'myapp:1.0' из Dockerfile в текущей директории (.)
docker build -t myapp:1.0 .