В Azure devops: как я могу ввести свои переменные конвейера в качестве appsettings при развертывании контейнера docker в Azure?

#azure #docker #.net-core #azure-devops #dockerfile

#azure #docker #.net-core #azure-разработка #dockerfile #azure-devops

Вопрос:

У меня возникли проблемы с настройкой моих настроек приложений в развернутом контейнере docker в Azure.

Моя настройка:

  • У меня есть приложение .NET Core
  • Мой конвейер сборки создает образ docker и помещает его в реестр моих контейнеров в Azure.
  • Мой конвейер выпуска извлекает изображение на основе тега и развертывает его в веб-приложении Azure.

Мне нужно развернуть образ в нескольких средах. Каждая среда имеет разные настройки приложений. Я определил переменные в моем конвейере «вкладка переменные»: введите описание изображения здесь И мне нужно отправить их в мой Azure, чтобы их можно было использовать. введите описание изображения здесь

Когда я добавляю их вручную, это работает, но я хочу извлечь их из своих переменных, поэтому мне нужно добавить их только один раз. (см. скриншот 1) введите описание изображения здесь
Редактировать: приведенный выше снимок экрана работает. Но это не то, что я ищу. Поскольку мне пришлось бы редактировать конвейер appsettings каждый раз, когда я добавляю или удаляю новый appsettings. Также я считаю, что удаление настройки приложения здесь просто оставит его в развернутой среде.

Я развертываю существующий образ docker, поэтому не могу отредактировать файл appsetting.json. Я также не буду создавать разные файлы docker для каждой среды.

Есть ли способ добиться этого? Как я могу извлечь / перечислить переменные, определенные в моем конвейере как переменные docker или appsettings?

Комментарии:

1. Вы не должны загружать файлы конфигурации в свои контейнеры. Пусть ваше приложение считывает настройки приложения из переменных среды и определяет соответствующие переменные среды в настройках вашего приложения Azure. Или используйте конфигурацию приложения Azure и управляйте этими значениями в Azure.

2. Что вы подразумеваете под «запеканием их в контейнеры». Мой вопрос в том, как я могу установить их во время конвейера выпуска, поэтому мне не нужен appsetting-production. json appestting-acceptance.json и т.д. Для каждой среды.

3. Значения конфигурации должны быть установлены в вашем веб-приложении Azure и загружены как переменные среды, или ваше приложение может быть настроено на прямую интеграцию с Azure Key Vault и конфигурацией приложения Azure, что обеспечивает альтернативный метод загрузки и использования конфигурации приложения. Ваш конвейер непрерывной доставки не подходит для управления конфигурацией вашего приложения.

4. Тогда как вы предлагаете использовать настройки приложений для разных сред?

5. Причина в том, чтобы избежать тесной привязки конфигурации вашего приложения к вашему решению непрерывной доставки. Ваше приложение должно иметь возможность создавать и развертывать с помощью любого инструмента (Azure DevOps, Jenkins, TeamCity, GitHub Actions или с локального компьютера для целей тестирования / отладки).

Ответ №1:

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

Например. у меня есть переменная, определенная как EnvironmentConnectionString , которая определена в двух областях:

  • Проверка области действия: «EnvironmentConnectionString = server=test-db; ….»
  • Scope QA: «EnvironmentConnectionString = server= qa-db; …»
  • Оценка выпуска: «logging_flag = включено»

Затем вы можете настроить это в своих «Настройках приложения и конфигурации», например

 - ConnectionString $(EnvironmentConnectionString)
- Logging $(logging_flag)
  

Обратите внимание на синтаксис $ (имя переменной) для использования этих переменных

Когда выполняются разные этапы конвейера, они автоматически принимают значения, характерные для этапа, и применяются к настройкам приложения Azure.

Комментарии:

1. Спасибо, но есть ли способ автоматически перечислить все переменные, определенные в настройках конфигурации? Я не хочу редактировать этот список в каждой среде (см. Мой третий снимок экрана)

2. Конечно, если вы с удовольствием переключитесь на конвейеры yaml.

Ответ №2:

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

Например: у Dev переменной Group и Release group есть переменные Port , RequestTimeout Port In Dev равно 4999, в то время как Port in Release может быть 5000. Мы можем связать эти группы с определенной областью действия этапа, Dev группой переменных для Dev этапа и Release группой для Release этапа.

[![введите описание изображения здесь][1]][1]

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

Обновить:

Каждый этап конвейера независим, они представляют разные среды. Итак, мы должны определить настройки этапа или настройки задач на этапах один за другим. Мы должны определять appsettings входные данные один за другим. [1]:https://i.stack.imgur.com/ukbjs.png

Комментарии:

1. Да, но тогда мне все равно пришлось бы определять каждый параметр и каждую переменную в части «настройки приложения», верно? Мой вопрос заключался в том, есть ли способ автоматического извлечения ВСЕХ переменных.

2. @Enrico Надеюсь, что мое обновление сможет разрешить вашу загадку. Не стесняйтесь, дайте мне знать, если я могу чем-нибудь помочь.

3. Боюсь, что я ищу более автоматизированное решение. Перечисление всех моих переменных одну за другой и передача их одну за другой в мой контейнер — это не то, что я ищу. (смотрите Мой скриншот с черным крестом)

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