You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

GitHub Actions中Docker Compose执行pytest时触发exit code 137错误求助

GitHub Actions中Docker Compose执行pytest时触发exit code 137错误求助

嘿,我之前也碰到过一模一样的问题!exit code 137本质就是进程因为内存不足被系统强制杀死的信号——毕竟GitHub Actions托管的runner资源有限(默认的ubuntu-latest runner只有2核7GB内存),而你本地用act跑的时候用的是自己机器的资源,内存富余自然不会触发这个问题。下面给你几个亲测有效的解决思路:

  • 优化测试用例的内存开销
    先自查下你的测试用例:是不是有加载大量测试数据、创建了过多未释放的对象,或者一次性跑了太多大型测试?可以试着把大测试拆成多个小测试,或者用pytest的fixture在每个测试用例执行完后清理资源,比如关闭数据库连接、删除临时文件等。另外如果用了pytest-cov做覆盖率统计,临时加个--no-cov参数跑测试,排除覆盖率工具额外占用内存的可能。

  • 给Docker容器设置内存限制
    你的testing.yaml里可以给api服务加上内存限制,避免它抢占runner的全部内存导致OOM(内存溢出):

    services:
      api:
        # 保留你原来的镜像、端口等配置
        deploy:
          resources:
            limits:
              memory: 4G  # 根据实际情况调整,别超过runner的总内存
    

    启动的时候记得加上--compatibility参数让限制生效:docker compose --compatibility -f testing.yaml up -d

  • 调整GitHub Actions的执行方式,减少Docker开销
    其实没必要在Docker容器里跑pytest,你可以把依赖服务(比如数据库、缓存)用docker compose启动,然后直接在GitHub Actions的runner环境里跑测试,这样能省掉一个容器的内存开销:

    1. 先启动测试依赖的服务:docker compose -f testing.yaml up -d db cache(替换成你实际的依赖服务名)
    2. 在runner里进入api目录,创建虚拟环境、安装requirements.txt里的依赖包
    3. 设置好连接依赖服务的环境变量(比如数据库地址设为localhost:5432),然后直接跑pytest
  • 升级runner规格(付费方案可选)
    如果你的测试确实需要大量内存,而上面的优化都不管用,可以考虑使用GitHub的更大规格托管runner,比如ubuntu-latest-4core(这个需要开启GitHub付费计划),它有4核14GB内存,能扛住更吃内存的测试任务。

另外给你个排查小技巧:在workflow的测试步骤前后加个查看内存的命令,确认是不是真的内存耗尽了,比如:

free -h

把这个命令加到测试执行的前一步和后一步,就能看到内存使用的变化情况。

备注:内容来源于stack exchange,提问作者Dejvinczi

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.15 14:12:57