docker-compose up -d报RLIMIT_MEM_LIMIT错误,mem_limit配置求助
我来帮你分析并解决这个启动错误:
问题场景
你在Ubuntu 16.04系统下,使用Docker 17.12.0-ce、Docker Compose 1.18.0启动Elasticsearch 5.6.0容器时,遇到了以下错误:
ERROR: for elasticsearch1 Cannot start service elasticsearch1: OCI runtime create failed: wrong rlimit value: RLIMIT_MEM_LIMIT: unknown
你的docker-compose.yml使用了版本3的配置,其中Elasticsearch服务包含mem_limit: 1000000000的内存限制项。
错误原因
正如你查阅Docker Compose文档发现的那样:当未运行在Swarm模式下时,即使使用版本3的配置文件,也必须使用版本2的内存限制语法。
在Compose版本3的规范中,mem_limit是专门给Swarm集群模式设计的配置字段;而在普通的Docker Compose单节点运行模式下,你的Docker和Compose版本(17.12.0-ce + 1.18.0)无法正确解析版本3配置里的mem_limit,从而触发了RLIMIT_MEM_LIMIT的未知错误。
解决方案
你只需要调整内存限制的配置写法,适配非Swarm模式的运行环境即可:
修改
docker-compose.yml中的内存配置
将原来的:mem_limit: 1000000000替换为版本2兼容的格式(非Swarm模式下,版本3配置依然支持版本2的资源限制字段):
# 可以用更易读的单位写法 mem_limit: 1g # 或者保留数值写法,格式本身没问题,只是需要确保非Swarm模式下使用版本2的语法逻辑 # mem_limit: 1000000000如果你想尝试版本3的
deploy配置,需要注意只有在Swarm模式下才会生效,非Swarm模式下依然会报错,所以不推荐:deploy: resources: limits: memory: 1g重新启动服务
修改完成后,执行以下命令重启容器:docker-compose down docker-compose up -d
额外说明
你配置中的bootstrap.memory_lock=true和ES_JAVA_OPTS=-Xms512m -Xmx512m已经合理设置了JVM堆内存,配合mem_limit:1g的配置(预留了足够的非堆内存空间),这部分不需要调整。
内容的提问来源于stack exchange,提问作者Rohith

