自定义Docker镜像在Gitlab CI中无法执行script脚本问题
我制作了一个极简Docker镜像,在GitLab中通过.gitlab-ci.yml使用该镜像时,script部分始终无法执行,日志仅显示:
Executing "step_script" stage of the job script
Cleaning up project directory and file based variables
添加report字段到yml后,最后一行显示‘Uploading artifacts for failed job’。
本地执行docker run MyImage <command>能正常运行bash命令,但GitLab流水线会在最后一行后无限挂起,永不结束。使用官方gradle镜像则完全正常,怀疑是自定义镜像的bash权限或配置有问题,请问该如何解决?
我的.gitlab-ci.yml内容
image: name: <... My Image ...> stages: - build build-stage: stage: build script: - echo "Testing echo"
我的Dockerfile内容
FROM ubuntu:20.10 CMD ["bash"]
问题原因及解决方法
核心问题:GitLab CI运行作业时,会默认覆盖镜像的
CMD指令,以bash -c '<script内容>'的方式执行脚本。但你的镜像仅设置CMD ["bash"],没有确保bash以非交互式非登录模式运行,加上终端环境配置缺失,导致脚本执行流程卡住。修复方案:
调整Dockerfile的指令:
GitLab CI更适配用ENTRYPOINT指定默认shell,这样脚本参数能被正确传递。修改后的Dockerfile:FROM ubuntu:20.10 ENTRYPOINT ["bash"]或者直接删除
CMD指令——ubuntu镜像默认的ENTRYPOINT已经是/bin/sh -c,GitLab可以正常调用bash执行脚本。确保bash环境完整且权限正确:
虽然ubuntu自带bash,但可以显式安装并确认权限:FROM ubuntu:20.10 RUN apt-get update && apt-get install -y --no-install-recommends bash RUN chmod +x /bin/bash在CI配置中显式指定shell:
在job里添加shell字段,强制用bash执行脚本:build-stage: stage: build shell: "/bin/bash" script: - echo "Testing echo"
内容的提问来源于stack exchange,提问作者Jan

