Какие методы вы используете для уменьшения размера Docker-образа?

«Какие методы вы используете для уменьшения размера Docker-образа?» — вопрос из категории Docker, который задают на 28% собеседований Devops Инженер. Ниже — развёрнутый ответ с разбором ключевых моментов.

Ответ

Для минимизации размера Docker-образов я применяю комбинацию следующих практик:

  1. Многоэтапные сборки (Multi-stage builds): Это самый эффективный метод. Сборка и зависимости остаются в промежуточных образах, а в финальный копируется только минимальный необходимый артефакт (бинарник, jar-файл).
  2. Выбор минимального базового образа: Использую alpine (на основе musl libc) или специальные distroless-образы от Google, которые содержат только приложение и его рантайм-зависимости, без shell или пакетного менеджера.
  3. Оптимизация слоев Dockerfile:
    • Объединяю связанные команды RUN в одну с помощью && и обратного слэша, чтобы уменьшить количество слоев.
    • Удаляю кэш пакетных менеджеров (apt-get clean, yum clean all, npm cache clean --force) в той же команде RUN, где они устанавливались, чтобы не зафиксировать их в слое.
    • Копирую только необходимые файлы, используя .dockerignore для исключения ненужных данных (.git, node_modules, временных файлов).
    • Копирую файлы в конце, так как изменение файла, скопированного на раннем этапе, инвалидирует все последующие кэшированные слои.

Пример оптимизированного Dockerfile для Go-приложения:

# Этап сборки
FROM golang:1.21-alpine AS builder
WORKDIR /app
COPY go.mod go.sum ./ 
RUN go mod download
COPY . .
RUN CGO_ENABLED=0 GOOS=linux go build -ldflags="-s -w" -o /myapp ./cmd/app

# Финальный этап
FROM gcr.io/distroless/static-debian12
WORKDIR /
COPY --from=builder /myapp /myapp
USER nonroot:nonroot
ENTRYPOINT ["/myapp"]

Дополнительные методы:

  • Использование инструментов типа dive для анализа каждого слоя образа.
  • Для образов с интерпретируемыми языками (Python, Node.js) — установка только production-зависимостей (pip install --no-cache-dir -r requirements.txt).
  • Сжатие статических ресурсов (JS, CSS) перед копированием в образ.