Ответ
Docker оптимизирует размер образов за счет слоистой файловой системы (UnionFS) и специальных практик написания Dockerfile.
Основные механизмы и best practices:
-
Многоэтапная сборка (Multi-stage build): Позволяет использовать один этап для сборки приложения, а другой — для финального образа, копируя только необходимые артефакты.
# Этап сборки FROM maven:3.8-openjdk-17 AS builder WORKDIR /app COPY . . RUN mvn clean package -DskipTests # Финальный этап FROM openjdk:17-jdk-slim WORKDIR /app COPY --from=builder /app/target/my-app.jar ./app.jar # Копируем только JAR CMD ["java", "-jar", "app.jar"] -
Использование минимальных базовых образов: Выбор
-slimили-alpineверсий (например,openjdk:17-jdk-slim,node:18-alpine). -
Объединение команд RUN и очистка кэша: Уменьшает количество слоев и удаляет временные файлы.
RUN apt-get update && apt-get install -y package && rm -rf /var/lib/apt/lists/* # Очистка кэша apt -
Игнорирование ненужных файлов: Использование
.dockerignoreдля исключения из контекста сборки файлов (.git,node_modules, логов, временных файлов). -
Переиспользование слоев: Общие базовые слои (ОС, runtime) кэшируются и используются разными образами, экономя дисковое пространство.