Google Cloud Build中Docker测试步骤突发137错误求助
问题背景
近2个月来,基于Docker Compose的Cloud Build构建流水线一直运行正常——通过docker-compose搭建集成测试环境,用docker exec命令在container-dev主容器内执行单元和集成测试。但从9月13日开始,哪怕重试之前成功过的流水线,「Run Unit & Integration Tests」步骤都会无详细日志直接返回状态码137。
已经试过这些操作但没用:
- 单独测试容器时减少内存占用,问题依旧
- 扩容Cloud Build的资源配置,无效
- 更新Google官方的
gcr.io/cloud-builders/docker镜像,故障仍然存在
所有失败场景的共同点:都使用了gcr.io/cloud-builders/docker镜像。
可能的原因
Cloud Build底层资源调度变更
9月中旬Google Cloud Build可能调整了底层资源调度或隔离策略,就算扩容了资源配额,实际分配给gcr.io/cloud-builders/docker镜像容器的内存/CPU资源还是被限制,导致docker exec执行测试时触发内存不足(状态码137对应SIGKILL信号,通常是OOM killer终止进程)。gcr.io/cloud-builders/docker镜像隐性更新
哪怕手动更新了镜像,最新版本可能引入了资源占用更高的依赖,或者Docker版本变更后和docker-compose出现兼容性问题,导致进程异常占用资源,最终被系统强制终止。Docker-in-Docker环境的资源隔离问题
Cloud Build里用gcr.io/cloud-builders/docker属于Docker-in-Docker场景,9月13日后底层网络或资源隔离策略变了,导致容器内的docker exec命令没法获取足够资源,进程直接被终止。
排查建议
- 在测试步骤前加内存监控命令,比如
free -m、docker stats --no-stream,输出资源使用情况,确认是不是真的内存不足 - 把
gcr.io/cloud-builders/docker镜像换成9月13日前的旧版本,验证是不是镜像更新导致的问题 - 别用
docker exec,直接在docker-compose里把测试命令设为容器启动命令,避免跨容器执行的资源开销 - 提交Google Cloud支持工单,查询9月13日前后Cloud Build的服务变更记录,确认有没有影响Docker-in-Docker场景的更新
内容的提问来源于stack exchange,提问作者Dom.MB

