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