Короткий ответ
Объединение нескольких связанных команд в одну инструкцию RUN через && (например, установку пакетов и очистку кэша пакетного менеджера в одной команде) уменьшает промежуточные артефакты, попадающие в финальный размер образа; но превращение всего Dockerfile в одну гигантскую команду ухудшает читаемость и кэшируемость — важнее группировать логически связанные шаги.
Как это работает подробнее
если apt-get install и rm -rf /var/lib/apt/lists/* выполнить в двух разных RUN, временные файлы пакетного менеджера будут зафиксированы в слое после install и останутся там физически (как в вопросе про слои и удаление файлов), даже если следующий слой их "скрывает". Объединение в одну RUN-команду гарантирует, что очистка произойдёт до фиксации слоя, и временные файлы не попадут в финальный образ вовсе.
Пример кода
RUN apt-get update
RUN apt-get install -y curl
RUN rm -rf /var/lib/apt/lists/*
RUN apt-get update && \
apt-get install -y curl && \
rm -rf /var/lib/apt/lists/*Что использовать на практике
- Практика. разумный баланс — объединять то, что логически представляет один шаг (установка + очистка кэша одного пакетного менеджера), но не сливать совершенно разные этапы (установка зависимостей и копирование кода приложения) в одну инструкцию, так как это ломает возможность переиспользовать кэш отдельно для каждого шага при последующих пересборках.
Подводные камни
- Риск. радикально минимизируют число слоёв ценой читаемости и кэшируемости, из-за чего любое изменение требует пересборки одного огромного шага; либо наоборот — оставляют установку и очистку в разных
RUN, искренне считая, что последующая очистка в отдельном слое уменьшает итоговый размер образа.