Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换
Posted
技术标签:
【中文标题】Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换【英文标题】:Azure Release Pipeline: Docker Image Tag will not be replaced even after adding step to replace image tag 【发布时间】: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 没有显示内部版本号。对此我将不胜感激。
在寻求帮助之前, 我已经从这个问题中尝试了一些 *** 答案,但无法这样做 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,这样它可以帮助遇到相同问题的其他社区成员,我们可以存档这个帖子,谢谢。 【参考方案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' < deployment-template.yaml > deployment.yaml displayName: Replace Environment Variables
它可以将图像标签更改为内部版本号,但是一旦继续执行下一个任务,图片标签回到 $TAG
我该如何使用 Helm 来解决这个问题?【参考方案2】:
不要直接运行envsubst '$TAG' <deployment.yml
,试试这个:
echo "$(envsubst '$TAG' <path\deployment.yml)" > path\deployment.yml
建议先导航(cd
)到你的depolyment.yml
文件所在的目录,然后运行命令echo "$(envsubst '$TAG' <deployment.yml)" > deployment.yml
。
有关您的问题的更多详细信息:
<
表示 infile,您仍然需要使用 >
将更改输出到一个文件。
检查注意 here:如果我们想使用相同的文件作为源文件和目标文件,我们将不得不使用类似moreutil的sponge
。但是 sponge
在托管代理中不可用,所以我建议使用 echo "$(originalCommand)" > 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) 变量的内容。
两个标签都引用同一个清单。
【讨论】:
以上是关于Azure 发布管道:即使添加了替换镜像标签的步骤,Docker 镜像标签也不会被替换的主要内容,如果未能解决你的问题,请参考以下文章
[错误] Bash 以代码“1”退出 - Azure YAML 管道中的替换错误