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
相关产品推荐
相关产品推荐

