Dockerfile.1
выполняет несколько RUN
:
FROM busybox
RUN echo This is the A > a
RUN echo This is the B > b
RUN echo This is the C > c
Dockerfile.2
объединяет их:
FROM busybox
RUN echo This is the A > a &&\
echo This is the B > b &&\
echo This is the C > c
Каждый RUN
создает слой, поэтому я всегда предполагал, что меньше слоев лучше и, следовательно, Dockerfile.2
лучше.
Это очевидно, когда a RUN
удаляет что-то, добавленное предыдущим RUN
(т.е. yum install nano && yum clean all
), но в тех случаях, когда каждый RUN
что-то добавляет, есть несколько моментов, которые нам нужно рассмотреть:
-
Слои должны просто добавить diff выше предыдущего, поэтому, если более поздний слой не удаляет что-то, добавленное в предыдущем, не должно быть большого дискового пространства, сохраняющего преимущества между обоими методами...
-
Слои вытягиваются параллельно от Docker Hub, поэтому
Dockerfile.1
, хотя, вероятно, немного больше, теоретически будет загружаться быстрее. -
Если добавить четвертое предложение (т.е.
echo This is the D > d
) и локально перестроить,Dockerfile.1
будет увеличиваться быстрее благодаря кешу, ноDockerfile.2
придется снова запускать все 4 команды.
Итак, вопрос: Какой лучший способ сделать Dockerfile?