Sobes.tech
Назад к вопросам
Senior
4

Что нужно, чтобы завернуть Go-приложение в Docker? Что такое multistage build и зачем сначала копировать go.mod/go.sum, а потом исходники?

Компании, где спрашивали
SelectelSelectel

Ответ от нейросети

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-приложение в контейнере с минимальным размером образа.