Почти нет разницы для ваших предоставленных опций. Если вы настаиваете, я могу сказать вам небольшую разницу:
1. Вывод двух изображений имеет разное количество слоев и небольшую разницу в размере:
Простой пример, следующий:
Вариант 1:
Dockerfile:
FROM centos:7
RUN yum install -y net-tools
Команда построения:
$ docker build -t trial:1 . --no-cache
Вариант 2:
Dockerfile:
FROM centos:7
ADD install.sh .
RUN ./install.sh
install.sh:
yum install -y net-tools
Команда построения:
$ docker build -t trial:2 . --no-cache
Сравните:
$ docker history trial:1
IMAGE CREATED CREATED BY SIZE COMMENT
f86f153f9d95 12 minutes ago |0 /bin/sh -c yum install -y net-tools 105MB
9f38484d220f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
$ docker history trial:2
IMAGE CREATED CREATED BY SIZE COMMENT
775be0061903 10 minutes ago |0 /bin/sh -c ./install.sh 105MB
b7ca1d2a7e8b 10 minutes ago /bin/sh -c #(nop) ADD file:6f96562be8deac728… 25B
9f38484d220f 3 months ago /bin/sh -c #(nop) CMD ["/bin/bash"] 0B
<missing> 3 months ago /bin/sh -c #(nop) LABEL org.label-schema.sc… 0B
<missing> 3 months ago /bin/sh -c #(nop) ADD file:074f2c974463ab38c… 202MB
Сверху вы можете увидеть, что если вы используете ./install.sh
, вам потребуется инструкция ADD
в Dockerfile
. По сравнению с вариантом 1, это увеличит слой изображения примерно на 20B
для вашего окончательно сгенерированного изображения.
2. Максимальный предел слоя изображения:
См. это обсуждение , максимальное количество слоев изображения докера равно 127, поэтому, если вы находитесь в особой ситуации, базовое изображение или ваше изображение уже использует слишком много слоев, это может быть полезно.
3. Эффективность копирования файлов с хоста в контейнер:
ADD
необходимо скопировать файл с хоста докера в контейнер. Внутренне docker build
создаст tar-файл из контекстного каталога, отправит его демону docker и распакует его. Таким образом, вопрос будет в том, зачем нам это нужно, если мы можем сделать это напрямую в Dockerfile
?
Но вас действительно волнует 20B
, еще один слой и небольшая скорость COPY? Я полагаю, если только в некоторых очень голых ситуациях нет никакой разницы для двух вариантов.
Однако, кажется, put package install directly in Dockerfile
- выбор большинства людей, потому что люди могут спросить, почему я должен приложить усилия, чтобы сохранить install.sh
, если это не принесло мне никакой пользы.