使用docker-compose启动Cassandra容器报错:无法锁定JVM内存(ENOMEM)
问题解决步骤
报错原因
该错误是Cassandra运行时尝试锁定JVM内存避免被系统交换到磁盘以提升性能,但Mac端Docker Desktop默认分配的内存上限不足,且容器默认的内存锁定权限限制导致的。
解决步骤
- 第一步:调整Docker Desktop资源分配
- 打开Docker Desktop,点击右上角齿轮形状的设置按钮
- 进入「Resources」→「Advanced」配置页
- 将内存分配调整为至少4GB,如果设备资源充足建议调整到8GB,同步将Swap调整为2GB以上
- 点击「Apply & Restart」等待Docker完成重启
- 第二步:修改docker-compose配置文件
在你的cassandra.yml的primecast-cassandra服务配置段,新增ulimit和JVM内存参数配置,修改后的完整配置如下:
version: '2' services: primecast-cassandra: image: cassandra:3.9 # volumes: # - ~/volumes/jhipster/primecast/cassandra/:/var/lib/cassandra/data ports: - 7000:7000 - 7001:7001 - 7199:7199 - 9042:9042 - 9160:9160 # 以下为新增配置 ulimits: memlock: soft: -1 hard: -1 environment: # 堆内存建议为Docker分配内存的1/2,若Docker分配4G内存则设为2G - MAX_HEAP_SIZE=2G - HEAP_NEWSIZE=512M primecast-cassandra-migration: extends: file: cassandra-migration.yml service: primecast-cassandra-migration environment: - CREATE_KEYSPACE_SCRIPT=create-keyspace.cql
配置说明:ulimits.memlock设为-1代表放开容器的内存锁定上限,避免出现无法锁定JVM内存的错误;JVM内存参数可以根据你分配给Docker的内存灵活调整,避免Cassandra占用内存过高。
- 第三步:重启服务验证
先执行以下命令清理之前启动失败的残留容器:docker-compose -f src/main/docker/cassandra.yml down -v
再重新启动服务即可:docker-compose -f src/main/docker/cassandra.yml up
内容的提问来源于stack exchange,提问作者Starbucks Admin
相关产品推荐
相关产品推荐

