Многоэтапные сборки для повышения эффективности
Используйте многоэтапные сборки для создания меньших и более безопасных рабочих образов, отделяя зависимости сборки от зависимостей выполнения.
«Многоэтапные сборки для повышения эффективности» — бесплатный урок DevOps Bootcamp на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения DevOps Bootcamp, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс DevOps Bootcamp содержит 4 уроков всего.
Введение в многоэтапные сборки
Добро пожаловать в раздел по расширенной оптимизации Dockerfile! Сегодня мы рассмотрим многоэтапные сборки — мощный приём для создания меньших и более эффективных образов Docker.
Меньшие образы быстрее загружаются, повышают безопасность и эффективнее используют ресурсы.

Почему размер образов имеет значение
При сборке образа Docker в него часто попадают инструменты и зависимости, нужные только в процессе сборки, но не во время работы готового приложения.
- Более быстрая загрузка: меньшие образы загружаются быстрее.
- Меньше места на диске: экономится место в реестрах и на хостах.
- Меньшая поверхность атаки: меньше компонентов означает меньше потенциальных уязвимостей.
- Повышенная безопасность: рабочий образ содержит только необходимое.
Проблема одноэтапной сборки
Рассмотрим скомпилированное приложение, например написанное на Go. Традиционный одноэтапный Dockerfile включал бы полный компилятор Go и зависимости для разработки в итоговый образ.
Из-за этого итоговый образ получается намного больше необходимого, поскольку компилятор не нужен для запуска скомпилированного двоичного файла.
Пример одноэтапной сборки (Go)
Вот простое приложение на Go и Dockerfile, который собирает его на одном этапе. Обратите внимание: среда сборки включается в итоговый образ.
main.go:
package main
import "fmt"
func main() {
fmt.Println("Hello from Single-Stage Docker!")
}Одноэтапный Dockerfile
В этом Dockerfile в качестве основы используется `golang:1.21-alpine`. После сборки приложения этот большой базовый образ вместе со всеми инструментами сборки остаётся в итоговом образе.
FROM golang:1.21-alpine
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
EXPOSE 8080
CMD ["./myapp"]Устройство многоэтапных сборок
Многоэтапные сборки решают эту проблему, позволяя определить несколько инструкций `FROM` в одном Dockerfile. Каждая инструкция `FROM` начинает новый этап сборки.
- Используйте ключевое слово
AS, чтобы дать этапу имя (например,FROM golang:1.21-alpine AS builder). - Затем можно скопировать артефакты с предыдущего этапа с помощью
COPY --from=<stage_name>.
В качестве образа сохраняется только последний этап.
Структура многоэтапной сборки
Типичный многоэтапный Dockerfile содержит как минимум два этапа:
- Этап сборки: содержит все инструменты и исходный код, необходимые для компиляции приложения.
- Этап выполнения: минимальный базовый образ, включающий только скомпилированное приложение и его зависимости для выполнения.
Промежуточный образ этапа сборки удаляется, поэтому итоговый образ получается компактным.
Пример многоэтапной сборки (Go)
Перепишем Dockerfile нашего приложения на Go с использованием многоэтапного подхода. Мы соберём приложение на первом этапе, а затем скопируем только скомпилированный двоичный файл в гораздо меньший базовый образ `alpine`.
# Stage 1: Build the application
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY main.go .
RUN go build -o myapp main.go
# Stage 2: Create the final lightweight image
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
EXPOSE 8080
CMD ["./myapp"]Запуск многоэтапной сборки
При сборке этого Dockerfile Docker выполняет каждый этап. Однако итоговый образ формируется только из содержимого последней инструкции `FROM` и файлов, скопированных с предыдущих этапов.
В результате образ получается значительно меньше одноэтапного, поскольку компилятор Go и инструменты сборки в него не попадают.
Преимущества многоэтапных сборок
Многоэтапные сборки особенно полезны для:
- Компилируемых языков: Go, Java, C++, Rust.
- Фронтенд-фреймворков: сборки приложений React/Angular и раздачи статических ресурсов с помощью Nginx.
- Приложений Node.js: установки `node_modules` на этапе сборки с последующим копированием только `package.json`, `package-lock.json` и собранного приложения в компактный образ для выполнения.
Проверьте свои знания
Каковы основные преимущества использования многоэтапных сборок Docker?
Итоги: эффективность многоэтапных сборок
Вы узнали о многоэтапных сборках Docker!
- Они используют несколько инструкций
FROMв одном Dockerfile. - Ключевое слово
ASзадаёт имена этапам, аCOPY --from=переносит артефакты. - Главное преимущество — значительно меньшие, более безопасные и эффективные итоговые образы.
Этот приём крайне важен для оптимизации приложений в контейнерах. Далее мы рассмотрим использование кэширования сборки!
Часто задаваемые вопросы
Урок «Многоэтапные сборки для повышения эффективности» бесплатный?
Да — полный текст урока «Многоэтапные сборки для повышения эффективности» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс DevOps Bootcamp, подпишись на CoddyKit PRO. Курс DevOps Bootcamp содержит 4 уроков всего.
Чему я научусь в уроке «Многоэтапные сборки для повышения эффективности»?
Используйте многоэтапные сборки для создания меньших и более безопасных рабочих образов, отделяя зависимости сборки от зависимостей выполнения. Ты практикуешь DevOps Bootcamp с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.
Нужен ли мне опыт, чтобы начать DevOps Bootcamp?
Предыдущий опыт не требуется. DevOps Bootcamp на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.
Сколько времени занимает урок «Многоэтапные сборки для повышения эффективности»?
Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.
Можно ли писать и запускать код в этом уроке DevOps Bootcamp?
Да. Каждый урок DevOps Bootcamp включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.
Все уроки этого курса
- Многоэтапные сборки для повышения эффективности
- Использование кэширования сборки
- Лучшие практики безопасности Dockerfile
- Уменьшение размера образов с помощью Slim и Distroless