Как написать Dockerfile для Go #
Инструкция о том, как написать Multi-Stage Dockerfile для сборки небольшого API-сервиса на Go.
Задача #
Вам нужно собирать проект на Go прямо в Dockerfile, и затем формировать финальный образ на базе Debian.
- Проект называется
my_project - Исполняемый файл называется
my-project
Решение #
# syntax=docker/dockerfile:1.7-labs
# ===== Этап 1. Сборка Go =====
FROM golang:1.26.1-trixie AS builder
WORKDIR /app
ENV GO111MODULE=on
# Загружаем зависимости до копирования остального кода,
# чтобы закешировать этот долгий шаг.
COPY --parents Makefile go.mod go.sum .
RUN --mount=type=cache,target=/go/pkg/mod \
go mod vendor
# Собираем статический бинарник, вызывая make
COPY . .
RUN --mount=type=cache,target=/go/pkg/mod \
--mount=type=cache,target=/root/.cache/go-build \
make build
# ===== Этап 2. Сборка runtime образа =====
FROM debian:trixie-slim
# Обеспечиваем валидацию TLS сертификатов
RUN apt-get update && \
apt-get install -y --no-install-recommends ca-certificates && \
rm -rf /var/lib/apt/lists/*
# Добавляем непривилегированного unix-пользователя для безопасности
RUN groupadd --system --gid 1000 appgroup && \
useradd --system --uid 1000 --gid appgroup --shell /bin/false appuser
WORKDIR /app
COPY --from=builder --chown=appuser:appgroup /app/bin/my-project /app/
USER appuser
EXPOSE 8080
CMD ["./my-project"]Пояснения #
В этом решении:
- Используем multi-stage сборку: первый stage собирает проект, второй stage копирует исполняемые файлы в runtime docker-образ
- Используем встроенные возможности современного Docker для кэширования слоёв
- Для сборки используем docker-образ
golang:1.26.1-trixie- Go 1.26.1 выпущен 5 марта 2026 года
- Debian Trixie выпущен 9 августа 2025 года
- Для запуска используем docker-образ
debian:bookworm-slim - Сервис будет запускаться из-под unix-пользователя
appuser