Как написать Dockerfile для Go

Как написать Dockerfile для Go #

Инструкция о том, как написать Multi-Stage Dockerfile для сборки небольшого API-сервиса на Go.

Задача #

Вам нужно собирать проект на Go прямо в Dockerfile, и затем формировать финальный образ на базе Debian.

  1. Проект называется my_project
  2. Исполняемый файл называется 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"]

Пояснения #

В этом решении:

  1. Используем multi-stage сборку: первый stage собирает проект, второй stage копирует исполняемые файлы в runtime docker-образ
  2. Используем встроенные возможности современного Docker для кэширования слоёв
  3. Для сборки используем docker-образ golang:1.26.1-trixie
    • Go 1.26.1 выпущен 5 марта 2026 года
    • Debian Trixie выпущен 9 августа 2025 года
  4. Для запуска используем docker-образ debian:bookworm-slim
  5. Сервис будет запускаться из-под unix-пользователя appuser

Сайт atdd.ru — блог разработчика.