Sobes.tech
Senior

Was braucht man, um eine Go-Anwendung in Docker zu verpacken? Was ist ein Multi-Stage-Build und warum zuerst go.mod/go.sum und dann die Quellcodes kopieren?

sobes.tech KI

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