Docker Compose升级MySQL到8.0.2后CircleCI出现Exit Code 137怎么解决
问题根因分析
你配置的resource_class: large是给CircleCI运行job的执行器用的,而你用了setup_remote_docker来运行Docker Compose服务,Remote Docker环境的资源是独立分配的,默认仅配备2G内存,完全无法满足MySQL 8.x的默认运行内存要求,所以即使你提升了job本身的内存,Docker运行的容器依然会触发OOM杀掉进程,返回Exit Code 137。本地环境内存充足所以不会触发该问题。
排查&解决方案
- 第一步:显式配置Remote Docker的资源规格
在setup_remote_docker配置块下增加资源声明,示例如下:- setup_remote_docker: docker_layer_caching: true resource_class: large # 给Remote Docker分配8G内存 - 第二步:优化MySQL 8的运行参数降低内存占用
在docker-compose.test.yml的mysql服务下添加启动命令,关闭非必要的高内存消耗功能,同时修正你当前配置中volume命名不匹配的问题(你当前声明的volume是proj-mysql-8.0.2,引用却写的proj-mysql,会导致匿名卷生成,拖慢初始化速度):mysql: image: "mysql:8.0.2" restart: always # 新增以下配置 command: > --default-authentication-plugin=mysql_native_password --performance-schema=OFF --innodb-buffer-pool-size=256M --innodb-flush-log-at-trx-commit=0 volumes: - proj-mysql-8.0.2:/var/lib/mysql expose: - "3306" - 第三步:增加服务健康检查避免初始化未就绪问题
MySQL 8的初始化时间比5.7长很多,depends_on仅保证容器启动不保证服务可用,容易引发后续连接报错,可以补充健康检查配置:mysql: # 原有配置不变 healthcheck: test: ["CMD", "mysqladmin", "ping", "-h", "localhost", "-uroot"] interval: 5s timeout: 10s retries: 20 app: depends_on: mysql: condition: service_healthy - 第四步:手动验证OOM状态
可以在测试运行步骤前后添加调试命令,确认具体被杀掉的容器:# 查看所有容器运行状态 docker ps -a # 查看容器是否被OOM杀掉,替换<容器ID>为mysql容器的ID docker inspect <容器ID> | grep OOMKilled # 查看所有容器的资源占用情况 docker stats --no-stream
内容的提问来源于stack exchange,提问作者MIGUEL ALFONSO FIGUEROA ANGULO
相关产品推荐
相关产品推荐

