定制Hugo Docker镜像适配GitLab CI时出现sh命令未知报错如何解决
问题解决
你遇到的报错 Error: unknown command "sh" for "hugo" 翻译成中文为:错误:"hugo" 命令无法识别 "sh" 子命令
问题根源
- 旧CI使用的
klakegg/hugo:asciidoctor-ci镜像默认入口点(ENTRYPOINT)为shell,GitLab CI运行任务时默认会调用sh执行script中的命令,逻辑完全匹配,所以运行正常 - 自定义镜像选择的基础镜像为
klakegg/hugo:asciidoctor,该版本镜像默认入口点是hugo二进制文件,GitLab CI触发任务时会尝试执行hugo sh 你的脚本内容,hugo没有sh子命令,因此直接报错
修复方案
有两种可选方案,任选其一即可:
方案1:更换基础镜像为带ci后缀的版本
直接沿用旧CI使用的asciidoctor-ci标签作为自定义镜像的基础,该版本默认入口点就是shell,完全适配GitLab CI的执行逻辑,修改后的Dockerfile如下:
FROM klakegg/hugo:asciidoctor-ci RUN gem install asciidoctor-html5s --no-document \ && apk --no-cache add openssh sshpass
方案2:手动重置自定义镜像的入口点
如果你不想更换基础镜像,只需要在Dockerfile中添加一行重置入口点的配置即可,修改后的Dockerfile如下:
FROM klakegg/hugo:asciidoctor RUN gem install asciidoctor-html5s --no-document \ && apk --no-cache add openssh sshpass # 重置入口点为shell,适配GitLab CI执行逻辑 ENTRYPOINT []
后续操作
修改Dockerfile后重新构建推送自定义镜像,再删除CI配置中gem install和apk add两行冗余的依赖安装命令,重新运行CI任务即可正常执行。
内容的提问来源于stack exchange,提问作者Hybras
相关产品推荐
相关产品推荐

