运行GitHub Action测试Docker镜像时出现Exit code 137错误如何解决
问题根因
Exit code 137代表进程收到系统的SIGKILL信号被强制终止,该报错在GitHub Actions场景下几乎都是内存不足触发的:GitHub免费公共仓库的Ubuntu运行器内存上限为7GB,你的本地环境内存充足所以pytest可以正常运行,CI环境内存被占满后系统会主动杀掉内存占用最高的pytest进程,就会触发该报错。
可落地的解决方案
- 第一步先开启pytest的详细日志输出,定位高内存占用的具体位置:将pytest步骤的命令修改为
docker exec fastapi-tdd python -m pytest tests -v --tb=short,输出每条测试用例的运行状态,确认是否存在测试用例内存泄漏、大对象未释放的问题。 - 优化pytest运行参数降低内存消耗:可添加
--no-header、-q参数减少日志输出占用的内存,若使用了pytest-xdist并行测试组件,先关闭并行功能改为单线程运行,并行测试会数倍提升内存占用。 - 给Docker容器加上内存限制,避免占用超出运行器阈值:修改Run container步骤的docker run命令,添加内存限制参数:
docker run \ -d \ --name fastapi-tdd \ --memory=4g \ --memory-swap=6g \ -e PORT=8765 \ -e ENVIRONMENT=dev \ -e DATABASE_TEST_URL=sqlite://sqlite.db \ -p 5003:8765 \ ${{ env.IMAGE }}:latest - 删除test job里的冗余构建步骤:当前test job重复执行了镜像拉取、构建操作,而build job已经将构建好的镜像推送到了GitHub Packages,test job直接使用拉取的镜像即可,删掉重复的Build image步骤可节省1-2GB的内存开销。
- 若以上优化仍不生效,可将pytest、flake8、black、isort四个检查步骤拆分为四个独立的job串行运行,避免多个检查任务同时运行抢占内存。
内容的提问来源于stack exchange,提问作者spetz83
相关产品推荐
相关产品推荐

