如何排查Docker中Cassandra启动失败报退出码137的问题
问题根因定位
退出码137是Linux系统下进程被**内存溢出杀手(OOM Killer)**强制终止的标志性返回值,你的日志显示Cassandra已经完成启动流程,之后突然退出没有错误日志,完全符合OOM终止的特征。
诊断步骤
- 第一步先确认是否为OOM导致:执行
docker inspect cassandra,查看返回结果中State.OOMKilled字段是否为true;也可以执行dmesg | grep cassandra查看系统内核日志,是否存在OOM终止Cassandra进程的记录。 - 检查Docker运行时可用内存:Cassandra默认会自动分配宿主机总内存的1/2作为JVM堆内存,加上堆外内存开销,单节点最低需要4G可用内存才能稳定运行。如果是Windows/macOS端的Docker Desktop,默认分配的内存通常只有2G,完全无法满足需求。
- 排查数据版本兼容问题:你之前使用
latest标签(对应4.x最新版)运行过,挂载目录下遗留的系统表数据和3.x版本不兼容,也会导致启动后静默崩溃。 - 检查挂载目录权限:Cassandra镜像默认使用UID为999的普通用户运行,如果你本地的
./cassandra/cassandra-data目录没有开放写入权限,进程写入数据失败也会触发异常退出。
解决方案
- 调整Docker运行时内存配额:如果使用Docker Desktop,在设置-资源界面将内存上限调整到至少8G;如果是WSL2后端,需要在用户目录下创建
.wslconfig文件配置内存上限,修改后重启WSL生效。 - 修改docker-compose配置,手动限制内存并指定JVM堆大小,避免Cassandra自动分配过大内存:
version: '3' services: cassandra: image: cassandra:3.0.24 container_name: cassandra # 指定运行用户,避免权限问题 user: 999 ports: - '7000:7000' - '9042:9042' - '9142:9142' volumes: - ./cassandra/cassandra-data:/var/lib/cassandra environment: - CASSANDRA_SEEDS=cassandra - CASSANDRA_PASSWORD_SEEDER=yes - CASSANDRA_PASSWORD=cassandra # 手动指定JVM堆大小,HEAP_NEWSIZE建议为MAX_HEAP_SIZE的1/4到1/5 - MAX_HEAP_SIZE=4G - HEAP_NEWSIZE=800M # 配置容器内存限制 deploy: resources: limits: memory: 8G reservations: memory: 4G networks: - default-dev-network networks: default-dev-network: external: true
- 清空旧数据目录:备份本地
./cassandra/cassandra-data目录中的内容后清空所有文件,重新启动容器生成对应版本的系统表数据。 - 确认端口无占用:执行
ss -tulnp | grep -E ':(7000|9042|9142)\s'检查宿主机对应端口没有被其他进程占用。
内容的提问来源于stack exchange,提问作者Yura
相关产品推荐
相关产品推荐

