You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Azure DevOps从JFrog Artifactory拉取Docker镜像到VM报错求助

问题

在Azure DevOps流水线中执行以下脚本拉取Docker镜像到VM时出现错误:

- task: AzureCLI@2
  displayName: Deploy image to test VM
  inputs:
    azureSubscription: 'Azure Subscription'
    scriptType: bash
    scriptLocation: inlineScript
    inlineScript: |
      az vm run-command invoke \
        --resource-group $(RESOURCE_GROUP) \
        --name $(VM_NAME) \
        --command-id RunShellScript \
        --scripts  'echo ${ARTIFACTORY_PASSWORD} | docker login ${ARTIFACTORY_URL} --username ${ARTIFACTORY_USER} --password-stdin
                    docker stop ${imageRepository} || true; \
                    docker rm ${imageRepository} || true; \
                    docker pull ${ARTIFACTORY_URL}/cicdwit/sample-cicd-app-wit:82-azure; \
                    echo 'Starting container...'; \
                    docker run -d --name ${imageRepository} -p 8081:80 ${fullImageName}'

收到的错误信息:

"docker pull" requires exactly 1 argument.
See 'docker pull --help'.

Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]

Download an image from a registry

##[error]"docker pull" requires exactly 1 argument.
##[error]See 'docker pull --help'.
##[error]Usage:  docker pull [OPTIONS] NAME[:TAG|@DIGEST]
##[error]Download an image from a registry
##[error]The process '/usr/bin/docker' failed with exit code 1

补充说明:尝试硬编码参数值后仍出现相同错误,但将脚本直接复制到VM中执行可正常运行。

解决方法
  • 修复引号冲突:脚本中--scripts使用单引号包裹整体内容,但内部echo 'Starting container...'的单引号会提前终止脚本解析,导致docker pull的参数被错误拆分。将内部单引号改为双引号,或对单引号转义:
    修改后的脚本片段:
    --scripts  'echo ${ARTIFACTORY_PASSWORD} | docker login ${ARTIFACTORY_URL} --username ${ARTIFACTORY_USER} --password-stdin
                docker stop ${imageRepository} || true; \
                docker rm ${imageRepository} || true; \
                docker pull ${ARTIFACTORY_URL}/cicdwit/sample-cicd-app-wit:82-azure; \
                echo "Starting container..."; \
                docker run -d --name ${imageRepository} -p 8081:80 ${fullImageName}'
    
  • 改用Here-doc避免转义问题:使用Here-doc格式传递脚本内容,可彻底避免引号和转义带来的解析错误:
    az vm run-command invoke \
      --resource-group $(RESOURCE_GROUP) \
      --name $(VM_NAME) \
      --command-id RunShellScript \
      --scripts "$(cat <<'EOF'
    

echo $ARTIFACTORY_PASSWORD | docker login $ARTIFACTORY_URL --username $ARTIFACTORY_USER --password-stdin
docker stop $imageRepository || true
docker rm $imageRepository || true
docker pull $ARTIFACTORY_URL/cicdwit/sample-cicd-app-wit:82-azure
echo 'Starting container...'
docker run -d --name $imageRepository -p 8081:80 $fullImageName
EOF
)"

- **验证变量可用性**:在脚本开头添加`echo`命令打印变量值,确认流水线中变量已正确定义并传递:
```bash
echo "ARTIFACTORY_URL: $ARTIFACTORY_URL"
echo "imageRepository: $imageRepository"
echo "fullImageName: $fullImageName"

内容的提问来源于stack exchange,提问作者Gosia Wiśniewska

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.13 04:13:11