Назад к вопросам
Selectel
Senior
4
Что нужно, чтобы завернуть Go-приложение в Docker? Что такое multistage build и зачем сначала копировать go.mod/go.sum, а потом исходники?
Компании, где спрашивали
Ответ от нейросети
sobes.tech AI
Чтобы завернуть Go-приложение в Docker, обычно создают Dockerfile, который описывает, как собрать и запустить приложение внутри контейнера.
Multistage build — это способ создавать несколько этапов сборки в одном Dockerfile. Первый этап — сборка приложения, второй — создание минимального образа с уже скомпилированным бинарником. Это позволяет уменьшить размер итогового образа, исключив из него инструменты сборки и исходники.
Почему сначала копируют go.mod и go.sum, а потом исходники:
- go.mod и go.sum содержат информацию о зависимостях.
- Копируя их отдельно и выполняя
go mod download, Docker кэширует слои с зависимостями. - Если исходники меняются, но зависимости — нет, Docker не будет заново скачивать зависимости, что ускоряет сборку.
Пример Dockerfile с multistage build:
# Этап сборки
FROM golang:1.20 AS builder
WORKDIR /app
COPY go.mod go.sum ./
RUN go mod download
COPY . .
RUN go build -o myapp
# Этап запуска
FROM alpine:latest
WORKDIR /app
COPY --from=builder /app/myapp .
CMD ["./myapp"]
Такой подход позволяет быстро собирать и запускать Go-приложение в контейнере с минимальным размером образа.