Многоэтапная сборка 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 — локальная установка не требуется.
Все уроки этого курса
- Многоэтапная сборка Docker для Go
- Конфигурация окружения и секреты
- Docker Compose для локальной разработки
- Проверки работоспособности и настройка для эксплуатации