Динамическое управление Dockerfile для разных клиентов в реализации конвейера CI / CD - PullRequest
13 голосов
/ 21 октября 2019

Я пытаюсь реализовать конвейер CI / CD для моего проекта, используя Docker, Kubernetes и Jenkins. Мое приложение является мультитенантным, в котором переменные приложения базы данных различны для разных арендаторов.

Прикладная стратегия

Когда я создаю образ докера, я использую Dockerfile. И я храню свой Dockerfile в своем хранилище кода SVN. Для каждого арендатора хранилище кода одинаково. Когда я создаю образ, тогда мне нужно создавать разные образы для разных арендаторов.

Реализация Dockerfile

В моем файле Docker я добавляю точку входа, подобную следующей,

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=tenant1config" , "TestProject.war"]

Если мне нужно создать образ Docker длядругому арендатору необходимо добавить
-Dspring.profiles.active=tenant2config

Таким образом, точка входа в Dockerfile является динамической.

My Confusion

  1. Для управления точкой входа команда внутри Dockerfile возможна динамически?
  2. Или мне нужно добавить другой Dockerfile для другого арендатора? И нужно ли запускать команду сборки docker отдельно для отдельного арендатора?

Как мне найти хороший стандартный способ реализации этой проблемы?

Ответы [ 3 ]

13 голосов
/ 21 октября 2019

Цитирование из 12 Фактор - Конфиг

Конфигурация приложения - это все, что может варьироваться в зависимости от развертывания (подготовка, производственная среда, среда разработки и т. Д.). Это включает в себя:

  • Дескрипторы ресурсов для базы данных, Memcached и других вспомогательных служб

  • Учетные данные для внешних служб, таких как Amazon S3 или Twitter

  • Значения для каждого развертывания, такие как каноническое имя хоста для развертывания

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

Существуют различные параметры для внедрения конфигурации времени выполнения

  1. Переменные среды

Вместо жесткого кодирования профиля в точке входа добавьте переменную среды

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$TENANT_PROFILE" , "TestProject.war"]

Затем введите переменную среды из конфигурации развертывания kubernetes. См. https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

Смонтируйте конфигурацию профиля как конфигурацию и отправьте ее

Ваша точка входа будет выглядеть как

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] Затем смонтируйте требуемый файл конфигурации как конфигурацию kubernetes.

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

3 голосов
/ 21 октября 2019

Вы можете использовать докер ARGS, он будет доступен только во время сборки и может использоваться на точке входа.

docker build --build-arg CONFIG_FILE=<file_name> -t tag_name .

CONFIG_FILE будет содержать расположение файла конфигурации, и вы можете передать его динамически. Замените вашу точку входа на $CONFIG_FILE

ENTRYPOINT ["java", "-jar", "-Dspring.profiles.active=$CONFIG_FILE" , "TestProject.war"]
0 голосов
/ 15 ноября 2019

См. - Рекомендации Dockerfile

ENTRYPOINT помогает настроить контейнер для запуска в качестве исполняемого файла, который может принимать аргументы во время выполнения

Любое динамическое свойство, которое вы 'Я хотел бы переопределить, может быть сделано во время выполнения с тем же изображением.

Вы можете передать необходимый аргумент во время выполнения.

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