Gymterview
middle

Как оптимизировать Dockerfile?

Оптимизация Dockerfile направлена на уменьшение размера образа и ускорение сборки за счёт правильной организации инструкций и выбора базовых образов.

1. Правильный порядок инструкций (кэширование)

Инструкции, которые меняются реже, должны быть в начале:

Пример
COPY pom.xml .
RUN mvn dependency:go-offline
COPY src ./src
RUN mvn package

2. Минимизация количества слоёв

Объединяйте команды RUN в одну инструкцию:

Пример
# Плохо: 3 слоя
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*

# Хорошо: 1 слой
RUN apt-get update && \
    apt-get install -y curl && \
    rm -rf /var/lib/apt/lists/*

3. Используйте минимальные базовые образы

  • eclipse-temurin:17-jre-alpine (~80 МБ) вместо eclipse-temurin:17-jdk (~400 МБ)
  • Alpine-образы значительно меньше Debian/Ubuntu-основанных
  • Для production нужен JRE, а не JDK

4. Удаляйте ненужное в том же слое

Пример
RUN apt-get update && \
    apt-get install -y --no-install-recommends curl && \
    curl -o tool.tar.gz https://example.com/tool.tar.gz && \
    tar -xzf tool.tar.gz && \
    rm tool.tar.gz && \
    apt-get purge -y curl && \
    rm -rf /var/lib/apt/lists/*

5. Дополнительные практики

  • Используйте .dockerignore для исключения ненужных файлов из контекста сборки
  • Используйте multi-stage builds для разделения среды сборки и запуска
  • Не запускайте контейнер от root
  • Используйте конкретные теги образов вместо latest:
Пример
# Плохо: непредсказуемый результат
FROM eclipse-temurin:latest

# Хорошо: воспроизводимая сборка
FROM eclipse-temurin:17.0.9_9-jre-alpine

На собеседовании: назовите минимум 4-5 практик. Самые важные: порядок инструкций для кэширования, минимальные базовые образы, multi-stage build, объединение RUN-команд, конкретные теги. Если можете объяснить почему каждая практика работает (через понимание слоёв) — это уровень middle+.