Docker - установить материал в Dockerfile или в сценарии внешней оболочки - PullRequest
1 голос
/ 11 июля 2019

Я полагаю, что есть два способа установить некоторую зависимость в Dockerfile:

1) в Dockerfile:

RUN yum install xxx 

2) поместить "yum install xxx" в скрипт install.shи в Dockerfile

RUN ./install.sh 

Кажется, что оба работают, просто блуждание - один лучше, чем другой?

Ответы [ 3 ]

1 голос
/ 12 июля 2019

Почти нет разницы для ваших предоставленных опций. Если вы настаиваете, я могу сказать вам небольшую разницу:

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, если это не принесло мне никакой пользы.

0 голосов
/ 11 июля 2019

Если вы создаете образы Docker, используйте нижеприведенный файл Dockerfile, а не сценарий для установки пакетов и их зависимостей.

RUN yum -y update && \ yum -y установить .. && \ ням чистить все

Используйте пользовательский сценарий оболочки для запуска специфичных для приложения сервисов внутри ENTRYPOINT в Dockerfile.

Используйте инструкции по добавлению / установке пакетов в одной команде RUN, чтобы уменьшить промежуточные слои изображений.

Хорошо использовать сценарий оболочки для установки пакетов и его зависимостей для образов без контейнеров / образов без докеров для автоматизации процесса для приложений на основе виртуальных машин.

0 голосов
/ 11 июля 2019

Docker создаст изображение для каждого Instruction на вашем Dockerfile, но если уже было изображение, созданное с этим Instruction, оно будет использовать это изображение вместо этого.

Поэтому, когда у вас есть Instructions на вашем Dockerfile для создания вашего изображения, важно упорядочить ваш Instructions таким образом, чтобы уменьшить количество промежуточных изображений.

Так что я думаю, если вы поместите все свои Instructions в один файл, у вас может быть меньше промежуточных изображений.Но также обратите внимание, что любые будущие изменения в этом файле приведут к созданию нового промежуточного изображения, поскольку уже не создано ничего для использования, что замедлит время создания изображения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...