【问题标题】:In azure devops: how can I inject my pipeline variables as appsettings when deploying a docker container to azure?在 azure devops 中:将 docker 容器部署到 azure 时,如何将管道变量作为 appsettings 注入?
【发布时间】:2020-12-22 19:20:25
【问题描述】:

我在 azure 上部署的 docker 容器中设置我的 appsettings 时遇到问题。

我的设置:

  • 我有一个 .NET 核心应用程序
  • 我的构建管道构建一个 docker 映像并将其推送到我在 azure 上的容器注册表。
  • 我的发布管道基于标签拉取图像并将其部署到 Azure Web 应用程序。

我需要将映像部署到多个环境。每个环境都有不同的应用设置。我在管道“变量选项卡”中定义了变量: 我需要将这些发送到我的天蓝色,以便它们可以使用。

当我手动添加它们时,它可以工作,但我想从我的变量中提取它们,所以我只需要添加一次。 (见截图1) 编辑:上面的截图有效。但这不是我要找的。因为每次添加或删除新的应用设置时,我都必须编辑应用设置管道。此外,我相信在此处删除应用设置只会将其保留在已部署的环境中。

我正在部署现有的 docker 映像,因此无法编辑 appsetting.json 文件。我也不会为每个环境制作不同的 docker 文件。

有没有办法做到这一点?如何将管道中定义的变量提取/列出为 docker 变量或 appsettings?

【问题讨论】:

  • 您不应该将配置文件烘焙到您的容器中。让您的应用程序从环境变量中读取应用程序设置,并在您的 Azure 应用程序设置中定义适当的环境变量。或者使用 Azure 应用配置并在 Azure 中管理这些值。
  • “将它们放入容器中”是什么意思。我的问题是如何在发布管道期间设置它们,所以我不需要每个环境的 appsetting-production.json appestting-acceptance.json 等。
  • 配置值应在您的 Azure Web 应用程序中设置并作为环境变量加载,或者您的应用程序可以配置为直接与 Azure Key Vault 和 Azure 应用程序配置集成,后者提供了另一种加载方法和消耗应用程序配置。您的持续交付管道不是管理应用程序配置的合适位置。
  • 那你建议如何为不同的环境设置appsettings?
  • 原因是避免将应用程序的配置与持续交付解决方案紧密耦合。您的应用程序应该能够通过任何工具(Azure DevOps、Jenkins、TeamCity、GitHub Actions 或从本地计算机进行测试/调试)来构建和部署。

标签: azure docker .net-core azure-devops dockerfile


【解决方案1】:

您可以在管道中定义管道变量,并将它们附加到特定的范围(读取阶段)或发布范围(应用到所有阶段)。

例如我有一个定义为EnvironmentConnectionString 的变量,它在两个范围内定义:

  • 范围测试:“EnvironmentConnectionString = server=test-db; ....”
  • 范围 QA:“EnvironmentConnectionString = server=qa-db;...”
  • 分数发布:“logging_flag=enabled”

然后您可以在“应用程序和配置设置”中进行设置,例如

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

注意使用这些变量的 $(变量名) 语法

当管道的不同阶段运行时,它们会自动获取特定于阶段的值并应用于 Azure 应用设置。

【讨论】:

  • 谢谢,但是否可以自动列出配置设置中定义的所有变量?我不想在每个环境中编辑该列表(请参阅我的第三个屏幕截图)
  • 如果您愿意切换到 yaml 管道,那当然可以。
【解决方案2】:

您可以为不同阶段设置不同的变量组。这些变量组应该有相同的用不同值定义的变量。

例如:Dev 变量组和Release 组都有变量PortRequestTimeout...Dev 中的Port 是4999,而Release 中的Port 可以为 5000。我们可以将这些组链接到特定的阶段范围,Dev 变量组用于Dev 阶段,Release 组用于Release 阶段。

[![在此处输入图片描述][1]][1]

确保您的所有阶段都具有相同的设置,然后将变量替换为不同范围的相应值。

更新:

管道中的每个阶段都是独立,它们代表不同环境。所以我们必须一一定义阶段的设置或阶段内的任务设置。我们必须一一定义appsettings输入。 [1]:https://i.stack.imgur.com/ukbjs.png

【讨论】:

  • 是的,但是我仍然必须在“应用程序设置”部分定义每个设置和每个变量,对吧?我的问题是是否有办法自动提取所有变量。
  • @Enrico 希望我的更新可以解决您的难题。如果我能提供任何帮助,请随时告诉我。
  • 恐怕我正在寻找更自动化的解决方案。一一列出我的所有变量并将它们一一传递给我的容器不是我想要的。 (见我的黑十字截图)
  • 对不起,我的解决方法不起作用,但正如我所知,在 devops 服务中,没有可用的功能可以直接从我的变量中提取它们...也许您可以 add a feature request 了解您在我们的用户语音论坛。
猜你喜欢
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-10-22
  • 1970-01-01
相关资源
最近更新 更多