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目录以读写模式挂载到容器内,命令示例:
这样容器才能直接访问和操作主机的Cgroup层级结构。docker run --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:rw mytag - 选择正确的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
相关产品推荐
相关产品推荐

