Ответ
Image Layer (слой образа) — это неизменяемый слой файловой системы, который является частью Docker-образа. Каждая инструкция в Dockerfile (например, FROM, RUN, COPY) создает новый слой.
Как это работает:
# Каждая строка создает новый слой
FROM alpine:latest # Слой 1: базовый образ ОС
RUN apk add --no-cache curl # Слой 2: установленный пакет curl
COPY ./app /opt/app # Слой 3: скопированные файлы приложения
CMD ["/opt/app/start.sh"] # Слой 4: метаданные (команда по умолчанию)
Ключевые особенности и преимущества:
- Кэширование слоев: Docker кэширует каждый слой. Если
Dockerfileи контекст сборки не изменились, повторная сборка использует кэш, что значительно ускоряет процесс. - Экономия дискового пространства: Разные образы могут совместно использовать одни и те же базовые слои (например,
alpine:latest). - Неизменяемость: После создания слой нельзя изменить. Обновление образа создает новые слои поверх старых.
- Эффективное дельтовое обновление: При пуше/пулле образа передаются только новые или измененные слои.
Практика оптимизации:
-
Объединяйте команды
RUNдля уменьшения количества слоев и удаления временных файлов в одном слое:# Плохо: создает два слоя, оставляет кэш apk RUN apk update RUN apk add curl # Хорошо: один слой, кэш очищен RUN apk update && apk add --no-cache curl && rm -rf /var/cache/apk/* - Используйте
.dockerignore, чтобы не копировать в контекст сборки ненужные файлы (например,node_modules,.git), что предотвращает создание излишне больших слоев. - Многоступенчатая сборка (
multi-stage build) позволяет копировать только артефакты (бинарники, jar-файлы) из промежуточных образов в финальный, исключая ненужные слои с инструментами сборки.