docker build & Tags
Тема дорожной карты · Docker & Containers
docker build читает Dockerfile и build-контекст (путь или URL) и создаёт из них Docker-образ. Для тегирования образа используются ключ -t name:tag, что позволяет организовать образы в репозитории. Если образ не тегирован, он становится <none>:<none> и может легко потеряться. В production рекомендуется использовать неизменяемые теги, такие как семантическая версия (semver) или хэш коммита (git SHA), чтобы избежать проблем с изменчивыми тегами, такими как :latest.
Как это работает
docker build использует Dockerfile для создания Docker-образа. Каждая инструкция в Dockerfile создаёт отдельный слой, который затем объединяется в конечный образ. Слои создаются по одному на каждую команду (RUN, COPY, ADD), и если команда и её родительский слой остаются неизменными, слой может быть извлечён из кэша, что ускоряет процесс сборки. Теги (repo:tag) представляют собой изменяемые указатели на конкретные версии образа, а контент образа адресуется по SHA-256 digest.
Multi-stage сборки (FROM base AS builder … FROM slim … COPY --from=builder) позволяют создавать несколько стадий сборки, где последний stage является финальным и содержит только те файлы, которые необходимы для запуска приложения. Это позволяет значительно уменьшить размер конечного образа.
Когда применять
Сортировка инструкций Dockerfile от наименее- к наиболее-часто-меняющимся (system dependencies → application dependencies → application source) помогает оптимизировать использование кэша. Это позволяет максимизировать попадания в кэш и ускоряет процесс сборки. Multi-stage сборки эффективны везде, где финальный образ требует меньше, чем сборка (Go-бинарники, скомпилированные ассеты, npm-собранный JS). Закрепление базовых образов по digest (FROM node:22-alpine@sha256:...) обеспечивает воспроизводимость и гарантирует, что вы используете конкретную версию базового образа, а не последнюю.
.dockerignore позволяет исключить определённые файлы и директории из build-контекста. Это особенно полезно для исключения файлов, которые не нужны для сборки, таких как .git, node_modules, тестовые артефакты и другие временные файлы.
Типичные ошибки
Одной из распространённых ошибок является использование изменяемого тега :latest в production, что может привести к проблемам, так как образ сегодня может отличаться от образа вчера. Огромные размеры образов могут быть вызваны командой apt-get update без последующего rm -rf /var/lib/apt/lists/*, что приводит к накоплению ненужных данных и увеличению размера образа. Уничтожение кэша из-за команды COPY . . перед RUN npm install также может привести к проблемам, так как каждое изменение кода инвалидирует слой зависимостей.
Секреты, запечатанные в слое через ENV, могут быть обнаружены в истории образа навсегда. Вместо этого рекомендуется использовать --secret mount или build args для безопасного хранения секретных данных.