ARM64架构MacOS下运行mesos-slave容器的cgroups错误解决求助
问题背景
在ARM64架构的MacOS上运行Mesos Slave容器时,因Docker Hub无原生ARM64镜像,基于CentOS7构建了自定义镜像,但启动时触发以下错误:
EXIT with status 1: Failed to create a containerizer: Could not create DockerContainerizer: Failed to create docker: Failed to find a mounted cgroups hierarchy for the 'cpu' subsystem; you probably need to mount cgroups manually
已尝试Podman、Colima及synthetic.conf创建符号链接等方法,均未解决;且同方法构建的Mesos Master和ZooKeeper容器可正常运行。
核心原因
MacOS本身不支持cgroups,Docker Desktop在Mac上的虚拟化层(如HyperKit)对cgroups的模拟存在限制,CentOS7的cgroups v1布局与Mac虚拟化环境不兼容,导致Mesos Slave无法找到预期的cpu子系统挂载点。
解决方案
方案1:调整Docker运行参数,适配cgroups模拟环境
修改docker run命令,添加cgroups相关配置,绕过挂载验证:
docker run \ --name local-mesos-slave \ -p 5051:5051 \ -e MESOS_MASTER=zk://local-zookeeper:2181/mesos \ -e MESOS_CONTAINERIZERS=docker \ -e MESOS_WORK_DIR=/tmp/mesos \ -e MESOS_SYSTEMD_ENABLE_SUPPORT=false \ -e MESOS_CGROUPS_ENABLE_CFS=false \ -e MESOS_CGROUPS_HIERARCHY=/sys/fs/cgroup \ -v /sys/fs/cgroup:/sys/fs/cgroup:rw \ --privileged \ mesos-slave:latest
MESOS_CGROUPS_ENABLE_CFS=false:关闭CFS调度器检查,跳过cpu子系统挂载验证--privileged:赋予容器操作cgroups的权限(仅建议测试环境使用)MESOS_CGROUPS_HIERARCHY:明确指定cgroups根路径,避免路径识别错误
方案2:改用Alpine Linux镜像构建Mesos Slave
CentOS7对cgroups依赖严格,Alpine的轻量环境更适配Mac虚拟化层的cgroups模拟:
修改Dockerfile:
FROM alpine:3.18 RUN apk update && \ apk add --no-cache mesos=1.10.0-r0 docker-cli && \ rm -rf /var/cache/apk/* ENTRYPOINT ["mesos-slave"] EXPOSE 5051
构建完成后使用原运行命令(或添加MESOS_CGROUPS_ENABLE_CFS=false)启动,Alpine的cgroups布局更简洁,兼容性更强。
方案3:切换Docker Desktop的cgroups版本
在Docker Desktop设置中调整cgroups版本:
- 进入
Settings->Features in development - 启用
Use the new Virtualization framework(若未开启) - 将
Cgroups v2切换为Cgroups v1,重启Docker生效
CentOS7镜像对cgroups v1的兼容性更好,可解决挂载识别问题。
方案4:使用Mesos原生容器化替代Docker
修改运行命令,改用Mesos原生容器化方式,绕过Docker对cgroups的依赖:
docker run \ --name local-mesos-slave \ -p 5051:5051 \ -e MESOS_MASTER=zk://local-zookeeper:2181/mesos \ -e MESOS_CONTAINERIZERS=mesos \ -e MESOS_WORK_DIR=/tmp/mesos \ -e MESOS_SYSTEMD_ENABLE_SUPPORT=false \ -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ mesos-slave:latest
此方案适合仅需Mesos原生任务调度的场景。
验证方法
启动容器后,进入容器检查cgroups挂载状态:
docker exec -it local-mesos-slave bash cat /proc/mounts | grep cgroup
若输出包含cpu子系统的挂载记录,说明配置生效。
内容的提问来源于stack exchange,提问作者Aayush Lamichhane

