You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Docker容器内能否创建cgroup?若可行需满足哪些条件?

能否在Docker容器内创建Cgroup?可行条件说明

可以在Docker容器内创建Cgroup,你遇到的Device or resource busy错误,是因为默认情况下容器的Cgroup被限制在Docker为其分配的子层级中,直接在根Cgroup层级创建会被拒绝。


你的相关配置与错误信息

Dockerfile

FROM python:3.12

RUN <<EOF
apt-get update
apt-get install -y cgroup-tools
EOF

WORKDIR /opt
COPY main.py main.py

CMD [ "python", "main.py" ]

main.py核心代码

import uuid
import subprocess

env_uuid = uuid.uuid4()
cgroup_name = f"exec_env_{env_uuid}"

subprocess.run(["cgcreate", "-g", f"memory:/{cgroup_name}"], check=True)

运行命令

docker buildx build --progress=plain --tag mytag . && docker run --privileged mytag

报错信息

cgcreate: can't create cgroup /exec_env_181a6832-1bba-4a3e-b3e8-2209cddd90ca: Device or resource busy

容器内创建Cgroup的必要条件

  • 开启特权模式:运行容器时必须添加--privileged参数,该参数会授予容器几乎与主机进程相同的权限,是操作Cgroup的基础前提。
  • 挂载主机Cgroup文件系统:需要将主机的/sys/fs/cgroup目录以读写模式挂载到容器内,命令示例:
    docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:rw mytag
    
    这样容器才能直接访问和操作主机的Cgroup层级结构。
  • 选择正确的Cgroup层级创建:即使挂载了主机的Cgroup,也不建议直接在根层级(如memory:/)创建,更合理的方式是在容器自身的Cgroup子路径下创建。可以通过读取容器内的/proc/self/cgroup文件获取当前Cgroup路径,再在该路径下创建子Cgroup,修改后的main.py示例:
    import uuid
    import subprocess
    
    # 获取容器当前的memory cgroup路径
    with open('/proc/self/cgroup', 'r') as f:
        for line in f:
            if 'memory' in line:
                current_cgroup = line.strip().split(':')[-1]
                break
    
    env_uuid = uuid.uuid4()
    cgroup_name = f"{current_cgroup}/exec_env_{env_uuid}"
    
    subprocess.run(["cgcreate", "-g", f"memory:{cgroup_name}"], check=True)
    

内容的提问来源于stack exchange,提问作者Rodrigo

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 17:02:20