Ответ
Команда docker build создает Docker-образ на основе инструкций из Dockerfile и файлов в контексте сборки.
Процесс сборки по шагам:
- Отправка контекста: Клиент Docker упаковывает все файлы и папки из указанного пути (например,
.) в tar-архив и отправляет его демону Docker. Файлы, указанные в.dockerignore, исключаются. - Чтение Dockerfile: Демон Docker последовательно выполняет каждую инструкцию из
Dockerfile. - Создание слоев: Каждая инструкция (
RUN,COPY,ADD) создает новый слой образа. Слой — это, по сути, файловая система с изменениями, внесенными инструкцией. - Использование кэша: Перед выполнением инструкции Docker проверяет, не выполнялась ли точно такая же инструкция ранее для этого же базового слоя. Если да, то существующий слой берется из кэша, что значительно ускоряет сборку.
- Финализация: После выполнения всех инструкций создается финальный образ, который является объединением всех слоев. Ему присваивается указанный тег.
Ключевые концепции:
- Слои (Layers): Образы Docker состоят из набора слоев, доступных только для чтения. Это делает их легковесными и позволяет переиспользовать общие слои между разными образами.
- Кэширование: Кэш для слоя сбрасывается (инвалидируется), если изменилась сама инструкция в
Dockerfileили изменился файл, который копируется командойCOPYилиADD. Все последующие слои также будут пересобраны. - Контекст сборки (Build Context): Это набор файлов, доступных для команд
COPYиADDвнутриDockerfile. Важно поддерживать контекст минимальным с помощью.dockerignoreдля ускорения сборки и уменьшения размера образа.
Пример команды:
# Собрать образ с тегом 'myapp:1.0' из Dockerfile в текущей директории (.)
docker build -t myapp:1.0 .