【问题标题】:Azure Release Pipeline: Docker Image Tag will not be replaced even after adding step to replace image tagAzure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换
【发布时间】:2020-09-25 10:37:11
【问题描述】:

我正在使用经典编辑器创建发布管道以部署到 Azure Kubernetes 服务,但是,在 Azure Kubernetes 服务 (AKS) 中部署后,我不断收到 InvalidImageName 错误。问题是由于无法在 Azure 容器注册表 (ACR) 中找到指定的映像,其中 docker 映像标记 ${TAG} 变量似乎无法被管道 $(Build.BuildId) 中的内部版本号替换。

我的 Azure 容器注册表 (ACR) 存储库

aks中的错误截图:

我尝试在发布管道中创建变量以将值分配给 TAG 变量。此后,我继续创建一个“命令行”任务步骤,将值设置到 deployment.yml 文件中。 它正在设置如下所示的值。但是,当我运行kubectl apply 命令来运行deployment.yml 文件时,TAG 没有显示内部版本号。对此我将不胜感激。

在寻求帮助之前, 我已经从这个问题中尝试了一些 stackoverflow 答案,但无法这样做 How to kubernetes "kubectl apply" does not update existing deployments How to provide docker image tag dynamically to docker-compose.yml in Azure Release Pipeline Task?

【问题讨论】:

  • 除了 infile 之外,当您尝试使用相同的文件作为源文件和目标文件时,您还需要指定输出文件。随意尝试我的答案,让我知道它是否有帮助:)
  • 你好朋友,这个问题怎么样?下面的答案是否解决了您的问题,如果是,您可以Accept it as an Answer,这样它可以帮助遇到相同问题的其他社区成员,我们可以存档这个帖子,谢谢。

标签: azure azure-devops continuous-deployment azure-aks azure-container-registry


【解决方案1】:

你本来就做不到(至少目前是这样)。

但是,您可以使用例如 HELM 并将部署更改为图表。

另一种方法是使用token replace,而且工作量肯定比使用 HELM 少。为此(对于默认配置),您需要将语法更改为 #{TAG}#

如果你使用 linux 主机代理,你也可以考虑envsubst 然后

    - script: |
        envsubst '${TAG}' < deployment-template.yaml > deployment.yaml
      displayName: Replace Environment Variables

我假设您使用${TAG} 提交的文件名为deployment-template.yaml

【讨论】:

  • 在显示名称为“替换环境变量”的任务中,我运行以下命令 - script: | envsubst '${TAG}' &lt; deployment-template.yaml &gt; deployment.yaml displayName: Replace Environment Variables 它可以将图像标签更改为内部版本号,但是一旦继续执行下一个任务,图片标签回到 ${TAG}
  • 我该如何使用 Helm 来解决这个问题?
【解决方案2】:

不要直接运行envsubst '${TAG}' &lt;deployment.yml,试试这个:

echo "$(envsubst '${TAG}' <path\deployment.yml)" > path\deployment.yml

建议先导航(cd)到你的depolyment.yml文件所在的目录,然后运行命令echo "$(envsubst '${TAG}' &lt;deployment.yml)" &gt; deployment.yml

有关您的问题的更多详细信息:

&lt; 表示 infile,您仍然需要使用 &gt; 将更改输出到一个文件。

检查注意 here:如果我们想使用相同的文件作为源文件和目标文件,我们将不得不使用类似moreutil的sponge。但是 sponge 在托管代理中不可用,所以我建议使用 echo "$(originalCommand)" &gt; outputfile 作为解决方法。

【讨论】:

    【解决方案3】:

    在构建阶段下的 azure-pipelines.yml 中有一个要添加标签的位置。

    stages:
    - stage: Build
      displayName: Build stage
      jobs:  
      - job: Build
        displayName: Build
        pool:
          vmImage: $(vmImageName)
        steps:
        - task: Docker@2
          displayName: Build and push an image to container registry
          inputs:
            command: buildAndPush
            repository: $(imageRepository)
            dockerfile: $(dockerfilePath)
            containerRegistry: $(dockerRegistryServiceConnection)
            tags: |
              $(tag)
              $(release)
    

    对我来说它在第 42 行。 在标签部分,您可以添加更多标签变量 或者只是硬编码它们。 我上面的设置在 acr 中创建了 2 个标签,一个带有内部版本号,另一个带有在管道上设置的 $(release) 变量的内容。

    两个标签都引用同一个清单。

    【讨论】:

      猜你喜欢
      • 2021-05-23
      • 1970-01-01
      • 2018-05-14
      • 2021-11-15
      • 2020-05-01
      • 2015-09-19
      • 2022-08-18
      • 2018-07-12
      • 1970-01-01
      相关资源
      最近更新 更多