从GitLab部署至Azure容器注册表失败,报错'sh'未被识别
GitLab CI/CD流水线错误原因分析
问题场景
用户配置的GitLab CI/CD流水线代码如下:
# .gitlab-ci.yml stages: - build - push build: stage: build services: - docker:dind image: docker:latest script: # Build the Docker image - docker build -t myfe:$CI_COMMIT_SHA . push: stage: push image: bitnami/azure-cli script: # - echo $DOCKERHUB_PASSWORD | docker login -u $DOCKERHUB_USERNAME --password-stdin - echo $ACR_CLIENT_ID | docker login mycr.azurecr.io --username $ACR_CLIENT_ID --password-stdin # Push the Docker image to the ACR - docker push myfe:$CI_COMMIT_SHA only: - main # before_script: # - echo "$DOCKERHUB_PASSWORD" | docker login -u "$DOCKERHUB_USERNAME" --password-stdin variables: DOCKERHUB_USERNAME: $DOCKERHUB_USERNAME DOCKERHUB_PASSWORD: $DOCKERHUB_PASSWORD
执行流水线后触发错误:
Using docker image sha256:373... for bitnami/azure-cli with digest bitnami/azure-cli@sha256:9128... ... ERROR: 'sh' is misspelled or not recognized by the system. Examples from AI knowledge base: https://aka.ms/cli_ref Read more about the command in reference docs
错误原因
bitnami/azure-cli镜像的默认入口命令(ENTRYPOINT)被设置为az,而GitLab CI执行script代码时,默认会用sh -c的方式启动容器并执行脚本。这就导致容器将sh识别为az命令的子命令,但az并不存在名为sh的子命令,因此抛出了"'sh' is misspelled or not recognized"的错误。
此外,该镜像本身未预装docker命令,即便解决入口问题,后续执行docker login、docker push等操作也会失败。
修复建议
- 更换镜像:选择包含
docker命令且默认入口为Shell的镜像,比如docker:latest(需搭配docker:dind服务),或者使用集成了azure-cli和docker工具的自定义镜像。 - 调整现有镜像配置:若坚持使用bitnami/azure-cli镜像,需手动覆盖镜像的ENTRYPOINT,让容器以Shell启动,并额外安装docker工具:
push: stage: push image: bitnami/azure-cli entrypoint: ["sh", "-c"] script: - apt-get update && apt-get install -y docker.io - echo $ACR_CLIENT_ID | docker login mycr.azurecr.io --username $ACR_CLIENT_ID --password-stdin - docker push myfe:$CI_COMMIT_SHA only: - main
内容的提问来源于stack exchange,提问作者Karel Macek
相关产品推荐
相关产品推荐

