GitLab共享Runner执行Pipeline报错:unknown command 'sh' for 'executor'
解决Kaniko镜像执行sh命令报错的问题
这个报错的核心原因是:gcr.io/kaniko-project/executor:debug镜像的默认ENTRYPOINT是["/kaniko/executor"],GitLab CI默认会在镜像上执行sh命令来运行脚本,这就相当于让/kaniko/executor去执行sh子命令,而它根本没有这个命令,所以报错。
下面给两种针对性的解决办法:
方法1:覆盖镜像的ENTRYPOINT,允许执行shell命令
如果你的Pipeline步骤确实需要先进入shell执行一些前置操作,可以在job里覆盖ENTRYPOINT为空数组,这样就能正常调用sh/bash了:
build-job: image: gcr.io/kaniko-project/executor:debug entrypoint: [""] # 覆盖默认entrypoint script: - echo "先执行一些shell操作" - /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "your-registry/image:tag"
方法2:直接使用Kaniko executor的命令(推荐)
如果你的目的就是构建Docker镜像,没必要先进入shell,直接把Kaniko的执行命令作为script内容即可,这样不需要修改ENTRYPOINT:
build-job: image: gcr.io/kaniko-project/executor:debug script: - /kaniko/executor --context "${CI_PROJECT_DIR}" --dockerfile "${CI_PROJECT_DIR}/Dockerfile" --destination "your-registry/image:tag"
另外注意,如果你用的是GitLab容器注册表,--destination可以写成${CI_REGISTRY_IMAGE}:${CI_COMMIT_TAG:-latest},这样能自动关联项目的注册表和版本标签。
内容的提问来源于stack exchange,提问作者Teamy
相关产品推荐
相关产品推荐

