Azure ACR Task执行Bash脚本异常及az命令找不到问题排查
Azure ACR Task执行脚本问题排查
问题现象
1. 初始配置无执行动作与日志
使用初始YAML创建ACR任务后,任务创建成功但无任何执行动作,也不输出日志——即使测试仅包含echo的简单脚本,同样没有输出。
初始YAML配置:
--- name: archive platform: os: linux steps: - cmd: | REGISTRY=*** PROD_REPO=*** ARCHIVE_REPO=*** echo "Logging into ACR..." az acr login --name $REGISTRY LATEST_TAG=$(az acr manifest list-metadata \ --registry $REGISTRY --name $PROD_REPO --orderby time_desc \ --query [0].tags[0] --output tsv) echo "LATEST_TAG: $LATEST_TAG" ALL_TAGS=$(az acr manifest list-metadata --registry $REGISTRY \ --name $PROD_REPO --output tsv) for TAG in $ALL_TAGS; do if [ \"$TAG\" != \"$LATEST_TAG\" ]; then echo "Archiving tag $TAG..." az acr import --name $REGISTRY --source "$REGISTRY/$PROD_REPO:$TAG" \ --repository $ARCHIVE_REPO --force done echo "Archiving process completed." context: /dev/null registry: ***
创建命令:
az acr task create --file archive.yaml --registry *** --name archive --schedule "* * * * *" --context /dev/null
测试用YAML(无输出):
--- name: archive-optimizer platform: os: linux steps: - cmd: | echo "Test..." context: /dev/null registry: ofsav
2. 添加version字段后日志正常,但出现命令错误
在YAML中添加version: v1.1.0后,任务开始输出日志,但执行时报错:az命令未找到。
更新后YAML配置:
version: v1.1.0 steps: - cmd: | REGISTRY=*** PROD_REPO=*** ARCHIVE_REPO=*** echo "Logging into ACR..." az acr login --name $REGISTRY LATEST_TAG=$(az acr manifest list-metadata \ --registry $REGISTRY --name $PROD_REPO --orderby time_desc \ --query [0].tags[0] --output tsv) || { echo "Failed to get latest tag"; exit 1; } echo "LATEST_TAG: $LATEST_TAG" ALL_TAGS=$(az acr manifest list-metadata --registry $REGISTRY \ --name $PROD_REPO --output tsv) || { echo "Failed to get all tags"; exit 1; } echo "ALL_TAGS: $ALL_TAGS" for TAG in $ALL_TAGS; do if [ \"$TAG\" != \"$LATEST_TAG\" ]; then echo "Archiving tag $TAG..." az acr import --name $REGISTRY --source "$REGISTRY/$PROD_REPO:$TAG" \ --repository $ARCHIVE_REPO --force || { echo "Failed to archive tag $TAG"; exit 1; } fi done echo "Archiving process completed."
原因分析
- 无执行动作与日志:ACR Task YAML缺少
version字段时,默认使用旧版本运行时,该版本对配置兼容性差,会导致任务无法正确解析执行步骤,进而无任何输出。 - az命令未找到:尽管官方文档说明ACR Task支持
az命令,但部分版本的运行时环境未预装Azure CLI,或CLI路径未加入系统环境变量;轻量型默认镜像也可能不包含Azure CLI。
解决方案
1. 修复无执行动作问题
在YAML中明确指定任务版本,推荐使用v1.1.0或更高版本,这是解决初始无输出问题的核心。
2. 解决az命令未找到问题
提供两种可行方案:
方案一:脚本内手动安装Azure CLI
在脚本开头添加安装命令,确保az可用:
version: v1.1.0 steps: - cmd: | # 安装Azure CLI curl -sL https://aka.ms/InstallAzureCLIDeb | bash # 原有脚本内容 REGISTRY=*** PROD_REPO=*** ARCHIVE_REPO=*** echo "Logging into ACR..." az acr login --name $REGISTRY # ... 剩余脚本内容
方案二:使用含Azure CLI的基础镜像
若任务需频繁执行,建议使用官方Azure CLI镜像作为运行环境:
version: v1.1.0 platform: os: linux image: mcr.microsoft.com/azure-cli:latest steps: - cmd: | REGISTRY=*** PROD_REPO=*** ARCHIVE_REPO=*** echo "Logging into ACR..." az acr login --name $REGISTRY # ... 剩余脚本内容
额外优化点
- 移除脚本中不必要的转义引号
\",Bash环境下无需该转义; - 可省略
context: /dev/null,或指定空目录(若无需构建上下文); - 利用ACR Task的托管身份进行认证,无需手动执行
az acr login,提升安全性与执行效率。
内容的提问来源于stack exchange,提问作者Abolfazl
相关产品推荐
相关产品推荐

