如何解决Azure发布管道:即使添加了替换图像标记的步骤,也不会替换Docker图像标记
我正在使用经典编辑器创建发布管道以部署到Azure Kubernetes服务,但是,在Azure Kubernetes服务(AKS)中部署后,我仍然收到InvalidImageName错误。该问题是由于Aks无法在Azure容器注册表(ACR)中找到指定的映像而造成的,其中docker映像标签$ {TAG}变量似乎无法替换为管道$(Build.BuildId)中的内部版本号。
我的Azure容器注册表(ACR)存储库
aks中的错误屏幕截图:
我试图在发布管道中创建变量,以将值分配给TAG变量。之后,我继续创建“命令行”任务步骤,以将值设置到deploy.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?
解决方法
从本质上讲,您无法执行此操作(至少当前是这样)。
但是,您可以使用HELM实例,并将部署更改为图表。
另一种方法是使用token replace,而且肯定比使用HELM少。为此(用于默认配置),您需要将语法更改为#{TAG}#
。
如果您使用的是Linux主机代理,还可以考虑envsubst
,然后
- script: |
envsubst '${TAG}' < deployment-template.yaml > deployment.yaml
displayName: Replace Environment Variables
我假设您将${TAG}
的文件命名为deployment-template.yaml
。
尝试直接执行以下操作,而不是直接运行envsubst '${TAG}' <deployment.yml
:
echo "$(envsubst '${TAG}' <path\deployment.yml)" > path\deployment.yml
建议首先导航(cd
至您的depolyment.yml
文件所在的目录,然后运行命令echo "$(envsubst '${TAG}' <deployment.yml)" > deployment.yml
。
有关您的问题的更多详细信息:
<
表示文件内,您仍然需要使用>
将更改输出到一个文件。
检查注释 here:如果我们要使用与源文件和目标文件相同的文件,则必须使用某些文件就像moreutil的sponge
。但是sponge
在托管代理中不可用,因此我建议使用echo "$(originalCommand)" > outputfile
作为解决方法。
在构建阶段的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)变量的内容。
两个标签都引用相同的清单。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。