Образ — неизменяемый снимок файловой системы и метаданных; контейнер — запущенный экземпляр образа. Понимание слоёв и кэша упрощает быструю и предсказуемую сборку.
Слои и 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 и политики — в базе знаний.