GitHub Actions 覆盖Docker容器自带entrypoint的解决方法问询
我正将原先的GitLab流水线迁移到GitHub Actions,这类流水线的运行环境完全由Docker容器提供。
在GitLab中仅需一行image: $DOCKER_TAG即可完成运行时配置:我们使用自行构建的私有镜像,镜像内置固定入口脚本ENTRYPOINT ["/run.sh"],该脚本会完成全部前置环境配置——例如加载Intel编译器的环境变量脚本setvars.sh、执行ulimit -s unlimited放开栈大小限制,最后通过exec "$@"正常执行后续传入的命令。
迁移到GitHub Actions后,我按照文档配置了任务级的容器参数:
container: image: ${{ matrix.DOCKER_TAG }}
但后续步骤执行的所有命令,都无法找到预先配置在环境中的二进制文件。翻看运行日志才发现,GitHub在创建容器时,会强制为docker run追加--entrypoint "tail"参数,直接覆盖了镜像原本内置的/run.sh入口。
我尝试在容器配置中添加options: --entrypoint '/run.sh'想恢复原有入口,但配置完全没有生效,从容器创建日志看根本没有应用这个参数,后续命令依然执行失败。
查阅官方文档和网络资料都没定位到问题根因,想请问是否存在无需单独编写Docker容器Action的方法,可以让镜像内置的entrypoint正常生效。
已尝试的替代方案及对应报错
我还试过另外两种解决思路,均未成功:
- 参考自定义Shell的配置方式,将
/run.sh指定为步骤的自定义Shell,写法为shell: '/run.sh {0}',执行时直接报错:
Error: Second path fragment must not be a drive or UNC name. (Parameter 'expression')
- 尝试两种动态引用Docker镜像的写法:
- 编写Docker容器Action时配置镜像为
image: docker://${{ inputs.docker_tag }} - 在任务步骤中直接引用远端Docker镜像,写法为:
```yaml - uses: docker://${{ matrix.DOCKER_TAG }} with: args: ./.github/actions/build/build.sh ```
上述两种写法都会触发表达式解析报错:
Unrecognized named-value: 'inputs'. Located at position 1 within expression: inputs.docker_tag
之前一直以为GitHub Actions的这类配置要求镜像名硬编码或每次重新构建镜像,没想到传入动态参数的写法也会直接报错。
内容的提问来源于stack exchange,提问作者P. B.

