Сборка программного обеспечения в докере - во время `build` или во время` run`? - PullRequest
0 голосов
/ 01 мая 2018

В настоящее время я использую docker для создания воспроизводимой среды сборки (для сборки ПЗУ Android). Теперь я хотел бы запустить несколько сборок, каждая с небольшими изменениями. Каждая сборка содержит несколько шагов, например

  1. Сборка ядра Linux
  2. Сборка Android
  3. Включить пользовательские приложения
  4. Изображение пакета

Если две сборки меняются только на шаге 3, было бы здорово иметь возможность повторно использовать первые два шага.

Я думаю о двух вариантах:

  • Войдите в мой докер-контейнер, запустите сборку и сохраняйте артефакты сборки на каждом шаге. Позже проверим, могу ли я их использовать. Для этого потребуется немало кодирования и ручное управление артефактами сборки.
  • Злоупотребление docker build. Создайте файл Docker для каждой конфигурации, используя одну команду RUN для каждого шага. Я думаю, что это позволит мне использовать кэширование докера - если две сборки отличаются только на шаге 3, докер повторно использует слой, содержащий шаги 1 и 2. Я бы только «запустил» созданный мною контейнер для копирования готового ПЗУ.

Есть ли "лучший" или канонический способ сделать это? Есть ли минус в использовании docker build таким образом?

Ответы [ 2 ]

0 голосов
/ 01 мая 2018

Второй вариант (опираясь на Dockerfile s + docker build) - определенно правильный путь.

Действительно, как вы уже упоминали об этом в своем вопросе, это позволит Docker использовать кэширование.

Кроме того, я напоминаю, что даже если с одной командой FROM ... связан только один Dockerfile, кэширование Docker уже будет активным. Вот почему в Dockerfile порядок команд имеет значение (предпочтительно запускать заранее команды, которые вряд ли изменятся при каждой сборке, а затем те команды, которые вероятно - такие как компиляция пользовательских приложений) .

Таким образом, вы можете выполнить шаги, описанные в ответе @ JabariDash, но если вы заметили, что промежуточное изображение repo/some-image используется только один раз (с помощью команды FROM repo/some-image в другом Dockerfile), обратите внимание, что вы можете избежать определения это repo/some-image в отдельном Dockerfile: действительно, вы можете поместить несколько команд FROM ... в один и тот же Dockerfile и полагаться на так называемые многоступенчатые сборки особенность Docker >= 17.05 .

0 голосов
/ 01 мая 2018

Вы можете создать так называемый «базовый образ» и отправить его в реестр докеров. Затем для двух ветвей этого изображения вы используете ключевое слово FROM. Но вместо использования базового изображения, например FROM ubuntu:latest, вы используете базовое изображение:

Чтобы использовать базовое изображение:

FROM repo/base-image:tag

Итак, ваша база может быть:

FROM ubuntu:14.04

# Step 1
COPY /tmp /tmp

# Step 2
ADD /src /src

Вы строите и толкаете это:

docker build -t repo/base-image .
docker push repo/base-image

Затем в двух других ваших файлах Docker ...

Dockerfile1

FROM repo/base-image:tag

# Step 3 specific to this Dockerfile1
ADD /something /somewhere

# Do different things
EXPOSE 443

Dockerfile2

FROM repo/base-image:tag

# Step 3 specific to this Dockerfile2
ADD /something-else /somewhere-else

# Do different things
EXPOSE 80

Таким образом, они имеют первые 2 общих слоя и отличаются только третьим слоем. Строки в файлах Docker называются слоями. Вроде как пересекать дерево. Чем больше линий, тем больше слоев / уровней. Но, основываясь на строке FROM repo/img:tag, она говорит вам, откуда наследовать ВСЕ предыдущие слои.

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