Многоэтапные сборки и уменьшение образов
Узнайте, как многоэтапные Dockerfile позволяют поставлять компактные рабочие образы, отделяя инструменты сборки от конечной среды выполнения и значительно уменьшая размер образа.
«Многоэтапные сборки и уменьшение образов» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 4 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Почему размер образа важен
Большие образы медленнее собирать, отправлять и загружать, а также они увеличивают поверхность атаки. Хорошая цель при разработке — выпускать самый маленький образ, в котором приложение всё ещё работает.
Проблема избыточного размера
Для сборки приложения часто требуются компиляторы, зависимости для разработки и инструменты сборки. Если они попадут в итоговый образ, его размер значительно увеличится, хотя работающему приложению они не нужны.
Что такое многоэтапная сборка?
Многоэтапная сборка использует несколько инструкций FROM в одном Dockerfile. На ранних этапах собирается приложение, а на последний этап копируются только готовые артефакты, поэтому инструменты сборки остаются за его пределами.
Именование этапа
Задайте этапу имя с помощью AS, чтобы последующие этапы могли ссылаться на него.
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ciСборка на первом этапе
На этапе сборки приложение компилируется или объединяется в пакет. Здесь доступны все зависимости и инструменты для разработки.
COPY . .
RUN npm run buildКомпактный последний этап
Начните последний этап с минимального базового образа, а затем скопируйте только необходимое для работы приложения с помощью COPY --from.
FROM node:20-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
COPY --from=builder /app/node_modules ./node_modulesПолный многоэтапный Dockerfile
Объединение этапов создаёт небольшой итоговый образ, содержащий собранное приложение, но не содержащий набор инструментов сборки.
FROM node:20 AS builder
WORKDIR /app
COPY package*.json ./
RUN npm ci
COPY . .
RUN npm run build
FROM node:20-slim
WORKDIR /app
COPY --from=builder /app/dist ./dist
CMD ['node', 'dist/main.js']Выбор небольшого базового образа
Базовый образ часто сильнее всего влияет на размер. Варианты Slim и Alpine значительно уменьшают размер образов:
node:20~ большойnode:20-slim~ значительно меньшеnode:20-alpine~ самый маленький, с минимумом библиотек
Только зависимости для рабочей среды
Не включайте зависимости для разработки в образ рабочей среды. Установка с флагом рабочей среды не позволяет пакетам для тестирования и сборки попасть в образ.
RUN npm ci --omit=devИспользование .dockerignore
Файл .dockerignore исключает ненужные данные из контекста сборки, ускоряет сборку и предотвращает случайное копирование секретов или огромных каталогов.
node_modules
.git
.env
Dockerfile
*.logИзмерение результата
Проверьте результат, сравнив размеры образов. Хорошо созданный многоэтапный образ может занимать лишь небольшую долю размера наивного одноэтапного образа.
docker images myappБыстрая проверка
Проверьте свои знания о многоэтапной сборке.
Итоги
Вы научились создавать компактные образы Docker:
- В многоэтапных сборках в одном Dockerfile используется несколько этапов
FROM - Сборка выполняется на раннем этапе, затем только артефакты копируются с помощью
COPY --fromна компактный последний этап - Выбирайте небольшие базовые образы (Slim или Alpine) и устанавливайте только зависимости для рабочей среды
- Используйте
.dockerignore, чтобы уменьшить контекст сборки
Небольшие образы быстрее собираются и развёртываются, а также безопаснее.
Часто задаваемые вопросы
Урок «Многоэтапные сборки и уменьшение образов» бесплатный?
Да — полный текст урока «Многоэтапные сборки и уменьшение образов» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Многоэтапные сборки и уменьшение образов»?
Узнайте, как многоэтапные Dockerfile позволяют поставлять компактные рабочие образы, отделяя инструменты сборки от конечной среды выполнения и значительно уменьшая размер образа. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 4 из 4.
Сколько времени занимает урок «Многоэтапные сборки и уменьшение образов»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Понимание Dockerfile
- Создание пользовательских образов Docker
- Слои образа и оптимизация
- Многоэтапные сборки и уменьшение образов