Загрузка...

Блог

Docker: образы, слои и практика сборки

Docker: образы, слои и практика сборки

Образ — неизменяемый снимок файловой системы и метаданных; контейнер — запущенный экземпляр образа. Понимание слоёв и кэша упрощает быструю и предсказуемую сборку.

Слои и Dockerfile

Каждая инструкция RUN, COPY, ADD создаёт слой. Слои кэшируются: при повторной сборке неизменённые шаги берутся из кэша. Порядок имеет значение: редко меняющиеся шаги (установка пакетов) — выше; код и конфиги — ниже, чтобы не инвалидировать кэш при каждом изменении. Объединяйте RUN в один слой там, где это не мешает кэшу (например, несколько apt-get install в одной команде с очисткой кэша).

Правило и зачем

ПравилоЗачем
Слои от реже к чаще меняющимсяКэш дольше живёт; изменение кода не пересобирает установку пакетов
Объединять RUN (apt-get install и т.п.)Меньше слоёв, один слой с пакетами
Multi-stage сборкаВ финальном образе только артефакт и рантайм, без инструментов сборки
.dockerignoreНе копировать в контекст лишнее (node_modules, .git) — быстрее сборка и меньше образ
Фиксировать тег базового образаНе latest — воспроизводимость сборки

Минимальный пример Dockerfile: FROM alpine:3.18, RUN apk add --no-cache nginx, COPY nginx.conf /etc/nginx/, EXPOSE 80, CMD ["nginx", "-g", "daemon off;"]. Сначала базовый образ и пакеты, потом конфиг — при смене только конфига пересоберётся последний слой.

Практика сборки

  • Базовый образ: alpine или slim-варианты для меньшего размера; фиксируйте тег (не latest).
  • Один процесс на контейнер; не держите в образе секреты и лишние данные.
  • Multi-stage: сборка в одном образе, финальный образ — только артефакт и рантайм.

Реестр и версионирование

Тегируйте образы по версии или коммиту; не полагайтесь на latest в проде. Реестр (Docker Hub, приватный) — единая точка распространения; CI собирает образ и пушит его при успешном прохождении тестов. Описание сборки и политик храните в базе знаний — так команда и чат по архиву будут давать согласованные ответы.

Практики применения

  • Упорядочивайте слои от реже к чаще меняющимся; используйте multi-stage для уменьшения образа.
  • Тегируйте по версии, не latest; храните Dockerfile и политики сборки в базе знаний.

Кратко: порядок слоёв — от реже к чаще меняющемуся; multi-stage — только артефакт в финале. Теги по версии, не latest. Реестр + CI. Dockerfile и политики — в базе знаний.