Каждый оператор RUN
, который вы добавляете в Dockerfile, создает новый слой, и в конце все слои объединяются (не объединяются напрямую, есть некоторые правила) для построения окончательного изображения.Даже если вы измените / удалите какой-либо файл на верхнем слое, он не удалит его с нижних слоев, просто каким-то образом затеняет его.
Вот пример Dockerfile:
FROM baseimage
RUN wget -O file http://...
RUN rm file
Длядля простоты, изображение, которое baseimage
составляет 100 МБ, file
составляет 80 МБ, и для этой сборки создано три слоя.Первый уровень - 100 МБ, второй - 80 МБ, последний имеет только некоторые метаданные, чтобы указать, что файл со второго уровня удален.Таким образом, результирующее изображение будет 180 МБ (состоит из трех слоев), даже если вы удалите 80 МБ на последнем слое.
Но если вы получите, установите и удалите один слой, вы увидите разницу:
FROM baseimage
RUN wget -O file http://... && rm file
Теперь ваш первый слой занимает 100 МБ, а второй слой - ~ 0 МБ (поскольку вы удаляете файл в том же операторе RUN
), а ваше изображение - 100 МБ.
В двух словах, вы должны установить и удалить в том же RUN
утверждении.