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+.