Dockerfile.1
выполняет многократный RUN
:Несколько RUN против однократного RUN в Dockerfile, что лучше?
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
лучше.
Это, очевидно, верно, когда RUN
удаляет что-то добавляется предыдущим RUN
(т.е. yum install nano && yum clean all
), но в тех случаях, когда каждый RUN
добавляет что-то, есть несколько моментов, которые мы должны рассмотреть следующие вопросы:
Layers предполагается, что просто добавьте diff выше предыдущего, поэтому, если более поздний слой не удалит что-то, добавленное в предыдущем, не должно быть большого дискового пространства, сохраняющего преимущество между обоими методами ...
Слои вытаскиваются параллельно от Docker Hub , поэтому
Dockerfile.1
, хотя, вероятно, немного больше, теоретически будет загружаться быстрее.При добавлении 4-ое предложение (т.е.
echo This is the D > d
) и локально восстановление,Dockerfile.1
будет строить быстрее благодаря кэш, ноDockerfile.2
придется выполнить все 4 команды снова.
Итак, вопрос: Какой лучший способ сделать Dockerfile?
Невозможно ответить в целом, так как это зависит от ситуации и использования изображения (оптимизируйте размер, скорость загрузки или скорость здания) – Henry