0Pricing
Go Academy · Урок

Многоэтапная сборка Docker для Go

Этап сборки с финальным образом scratch/alpine

«Многоэтапная сборка Docker для Go» — бесплатный урок Go Academy на CoddyKit. Это урок 1 из 4. Ты можешь прочитать весь урок бесплатно ниже — а потом практиковать его прямо в браузере с встроенным редактором кода и ИИ-репетитором 24/7. Это часть пути обучения Go Academy, и твой прогресс синхронизируется между веб-версией и приложением CoddyKit. Курс Go Academy содержит 4 уроков всего.

Зачем нужны многоэтапные сборки?

Одноэтапная сборка, компилирующая код Go, создаёт большой образ с полным набором инструментов Go. Многоэтапные сборки компилируют код на одном этапе, а затем копируют только двоичный файл в минимальный итоговый образ.

Базовый многоэтапный Dockerfile

На этапе сборки компилируется двоичный файл, а на итоговом этапе он копируется в минимальный базовый образ:

FROM golang:1.22-alpine AS build
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o myapp ./cmd/server

FROM scratch
COPY --from=build /app/myapp /myapp
COPY --from=build /etc/ssl/certs/ca-certificates.crt /etc/ssl/certs/
ENTRYPOINT ["/myapp"]

FROM scratch

Образ FROM scratch не содержит ничего: ни оболочки, ни системных библиотек. Двоичный файл Go должен быть статически связан (CGO_ENABLED=0) и явно включать все необходимые файлы.

FROM distroless

Образы Google distroless предоставляют минимальный набор системных библиотек (сертификаты CA, данные часовых поясов) без оболочки — это безопаснее, чем scratch, для двоичных файлов, которым нужны libc или сертификаты TLS.

FROM gcr.io/distroless/static-debian12
COPY --from=build /app/myapp /
ENTRYPOINT ["/myapp"]

FROM alpine для работы с оболочкой

Используйте Alpine как итоговый базовый образ, если для отладки нужна оболочка или двоичный файл использует CGO. Alpine добавляет около 5 МБ, но содержит оболочку и менеджер пакетов.

Кэширование слоёв для go.mod

Сначала скопируйте go.mod и go.sum и выполните go mod download, а уже затем копируйте исходный код. Этот слой кэшируется до изменения зависимостей, что ускоряет повторные сборки.

COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build ...

-ldflags="-s -w"

-s удаляет таблицу символов, а -w — отладочную информацию DWARF. Вместе они уменьшают размер двоичного файла на 30–50% без влияния на работу программы.

Аргументы сборки

Используйте ARG для добавления информации о версии во время сборки:

ARG VERSION=dev
RUN go build -ldflags="-X main.version=${VERSION}" -o myapp .

Пользователь без прав root

В целях безопасности запускайте двоичный файл от имени пользователя без прав root. Добавьте пользователя в базовый образ или используйте тег nonroot образа distroless:

FROM gcr.io/distroless/static-debian12:nonroot

Размер итогового образа

Типичный двоичный файл Go из scratch занимает 5–20 МБ. Alpine добавляет около 5 МБ. Полный образ golang занимает около 800 МБ. Многоэтапные сборки значительно уменьшают поверхность атаки и время загрузки образа.

.dockerignore

Добавьте .dockerignore, чтобы исключить файлы из контекста сборки: vendor/, .git/, *.test, *.prof. Это ускоряет сборку Docker и предотвращает включение конфиденциальных файлов.

.git
vendor
*.test
*.prof
.env

Быстрая проверка

Почему при сборке двоичного файла Go для образа Docker на основе FROM scratch необходимо установить CGO_ENABLED=0?

Итоги: многоэтапные сборки Docker

Ключевые моменты:

  • Этап сборки: образ golang; итоговый этап: scratch/distroless/alpine
  • CGO_ENABLED=0 для статического двоичного файла (требуется для scratch)
  • Сначала копируйте go.mod для кэширования слоёв; используйте -ldflags="-s -w" для уменьшения двоичного файла
  • .dockerignore для исключения .git, vendor и файлов тестов

Часто задаваемые вопросы

Урок «Многоэтапная сборка Docker для Go» бесплатный?

Да — полный текст урока «Многоэтапная сборка Docker для Go» бесплатно доступен здесь в веб-версии. Чтобы практиковать его интерактивно (встроенный редактор кода и ИИ-репетитор 24/7) и разблокировать остальной курс Go Academy, подпишись на CoddyKit PRO. Курс Go Academy содержит 4 уроков всего.

Чему я научусь в уроке «Многоэтапная сборка Docker для Go»?

Этап сборки с финальным образом scratch/alpine Ты практикуешь Go Academy с помощью реального кода, который запускаешь прямо в браузере, и ИИ-репетитор 24/7 отвечает на твои вопросы во время урока.

Нужен ли мне опыт, чтобы начать Go Academy?

Предыдущий опыт не требуется. Go Academy на CoddyKit структурирован для всех уровней — от новичков до продвинутых, поэтому ты можешь начать отсюда или с самого начала и учиться в своем темпе. Это урок 1 из 4.

Сколько времени занимает урок «Многоэтапная сборка Docker для Go»?

Большинство уроков CoddyKit занимают около 5–10 минут. Каждый из них компактный и интерактивный, поэтому ты постоянно делаешь прогресс и продолжаешь с того же места в веб-версии и приложении.

Можно ли писать и запускать код в этом уроке Go Academy?

Да. Каждый урок Go Academy включает встроенный редактор кода, поэтому ты пишешь и запускаешь реальный код прямо в браузере и получаешь моментальную обратную связь от AI — локальная установка не требуется.

Все уроки этого курса

  1. Многоэтапная сборка Docker для Go
  2. Конфигурация окружения и секреты
  3. Docker Compose для локальной разработки
  4. Проверки работоспособности и настройка для эксплуатации
← Назад к Go Academy