Docker построить 2 изображения из 1 Dockerfile - PullRequest
0 голосов
/ 28 июня 2018

У меня есть настройки, где я собираю 2 варианта окончательного контейнера - полную версию и версию Slim. И оба варианта имеют 2 контейнера в 2 этапа:

  • Получите все требования для полной / тонкой версии и сделайте контейнер
  • Установите приложение на полный или тонкий базовый контейнер и сделайте окончательный контейнер

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

Так что мне интересно, как лучше всего было бы сделать последний шаг в виде 1 Dockerfile, который бы генерировал 2 изображения и переключался только между 2 различными FROM. Я думал о двух разных способах сделать это:

  • Имейте Dockerfile.template и bash, генерирующие 2 заказных файла Dockerfiles из шаблона.
  • Имейте 3 разных файла с общей логикой, а затем 2 уникальных файла Docker для полной / тонкой установки и включайте общую логику в обе.

Но мне интересно, есть ли лучший подход? Или я что-то пропустил?

Ответы [ 3 ]

0 голосов
/ 28 июня 2018

Вы можете использовать конфигурацию во время сборки с ARG .

инструкции FROM поддерживают переменные, которые объявлены любым ARG инструкции, которые встречаются до первого ОТ. ARG, объявленный до FROM, находится вне стадии сборки, поэтому его нельзя использовать ни в одной инструкции после FROM. Чтобы использовать значение по умолчанию для ARG, объявленного перед первым FROM, используйте инструкцию ARG без значения внутри этапа сборки:

Dockerfile:

ARG imagename
FROM $imagename
RUN echo $imagename

Запуск с двумя различными базовыми изображениями:

docker build --build-arg imagename=alpine .

выходы:

Step 1/3 : ARG imagename
Step 2/3 : FROM $imagename
latest: Pulling from library/alpine
ff3a5c916c92: Pull complete 
Digest: sha256:e1871801d30885a610511c867de0d6baca7ed4e6a2573d506bbec7fd3b03873f
Status: Downloaded newer image for alpine:latest
 ---> 3fd9065eaf02
Step 3/3 : RUN echo $imagename
 ---> Running in 96b45ef959c3

Removing intermediate container 96b45ef959c3
 ---> 779bfc103e9e
Successfully built 779bfc103e9e

В качестве альтернативы:

docker build --build-arg imagename=busybox .

Результат:

Step 1/3 : ARG imagename
Step 2/3 : FROM $imagename
latest: Pulling from library/busybox
07a152489297: Pull complete 
Digest: sha256:141c253bc4c3fd0a201d32dc1f493bcf3fff003b6df416dea4f41046e0f37d47
Status: Downloaded newer image for busybox:latest
 ---> 8c811b4aec35
Step 3/3 : RUN echo $imagename
 ---> Running in 6027fe4f5b7b

Removing intermediate container 6027fe4f5b7b
 ---> 28640f123967
Successfully built 28640f123967

См. Также этот блог для получения дополнительных идей.

0 голосов
/ 20 июля 2018

Другой вариант - динамически создавать несколько файлов из одного файла. Проблема в том, что Docker 1.7.1 не поддерживает --build-arg, и чтобы быть разумным, он терпит неудачу

Так что, если Dockerfile должен работать на современных и старых докерах, то он должен соответствовать 1.7.1, который является самым новым, который может работать с centos / rhel 6 (6.9 в моем случае).

Мне пришлось прибегнуть к использованию envsubst для замены переменных значениями перед запуском сборки Docker. Вы можете передать результат envsubst непосредственно в Docker или сначала сохранить его в файл. Сохранение его в файл сначала позволит вам устранить неполадки ввода. Например, один pitfal должен использовать все переменные, которые в конце могут попытаться разрешить больше, чем вы хотели бы, я лично использую envsubst всегда с аргументом, перечисляющим, какие переменные он может разрешить, поэтому он не будет пытаться разрешить что-либо еще.

0 голосов
/ 28 июня 2018

Вы также можете использовать ARG в FROM

ARG BASE_IMAGE
FROM $BASE_IMAGE
....

Итак, передайте BASE_IMAGE в качестве аргумента сборки во второй части и делайте так. Несколько FROM в док-файле предназначены для многоступенчатой ​​сборки и не применимы к этому варианту использования, поскольку многоступенчатые файлы докера по-прежнему дают только один конечный контейнер

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