Динамічне управління Dockerfile для різних орендарів у впровадженні конвеєра CI / CD


13

Я намагаюся реалізувати трубопровід CI / CD для свого проекту за допомогою Докера, Кубернетеса та Дженкінса. Моя програма - це багатокористувацька програма, у якій змінні програми додатків баз даних для різних орендарів все різні.

Стратегія застосування

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

Реалізація докерфайлу

У свій файл докера я додаю точку входу, як описано нижче,

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

Якщо мені потрібно створити зображення Докера для іншого орендаря, потрібно додати
-Dspring.profiles.active=tenant2config

Тож точка входу в Dockerfile є динамічною.

Моя плутанина

  1. Для управління командою точки введення всередині Dockerfile можливо динамічно?
  2. Або мені потрібно додати ще один Dockerfile для іншого орендаря? І потрібно запустити команду docker build окремо для окремого орендаря?

Як я можу знайти хороший стандартний спосіб реалізації цієї проблеми?


3
Ви можете використовувати змінну середовища у своєму, ENTRYPOINTтобто ... -Dspring.profiles.active=${TENANT}встановити правильне середовище під час розгортання.
masseyb

Відповіді:


13

Цитування від 12 факторів - Налаштування

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

  • Ресурс обробляє базу даних, Memcached та інші сервіси резервного копіювання

  • Посвідчення зовнішніх служб, таких як Amazon S3 або Twitter

  • Значення на розгортання, такі як канонічне ім'я хоста для розгортання

Ви повинні НЕ будувати окремі зображення Docker для кожного орендаря в якості бінарної повинні бути однаковими , і будь-які конфігурації під час виконання повинні бути введені через навколишнє середовище.

Існують різні варіанти введення конфігурації виконання

  1. Змінні середовища

Замість жорсткого кодування профілю в точку введення додайте змінну середовища

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

Потім введіть змінну оточення з конфігурації розгортання kubernetes. Перегляньте https://kubernetes.io/docs/tasks/inject-data-application/define-environment-variable-container/

  1. Змонтуйте конфігурацію профілю як конфігурацію та відправте її

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

ENTRYPOINT ["java", "-jar", --spring.config.location="file:/path/to/tenantconfig.yaml" , "TestProject.war"] Потім змонтуйте потрібний конфігураційний файл у вигляді кубернету.

У будь-якому випадку екстерналізація конфігурації виконання з зображення докера та введення її через конфігурацію розгортання у вигляді змінної середовища чи конфігурації.


1
SPRING_PROFILES_ACTIVE, оскільки змінна середовища повинна працювати поза коробкою. Немає необхідності в додатковому параметрі Java.
Мануель Полачек

3

Ви можете використовувати докер 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"]

ARG CONFIG_FILE - має бути оголошено всередині Dockerfile
Роман М

0

Довідка - Кращі практики Dockerfile

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

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

Ви можете передати необхідний аргумент під час виконання.

Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.