使用Docker-Compose自定义Dockerfile运行Jenkins失败:无法创建cpuset目录
问题
自定义Dockerfile并通过Docker-Compose运行Jenkins时,容器无法持续运行,报错mkdir: cannot create directory ‘cpuset’: Read-only file system。明明容器内已切换为root用户,却仍出现该权限问题。
Dockerfile内容
FROM jenkins/jenkins USER root RUN apt-get update -qq && apt-get install -qqy apt-transport-https ca-certificates curl gnupg2 software-properties-common RUN curl -fsSL download.docker.com/linux/debian/gpg | apt-key add - RUN add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" RUN apt-get update -qq && apt-get install -qqy docker-ce docker-ce-cli containerd.io RUN usermod -aG docker jenkins ENTRYPOINT ["/bin/sh", "-c", "service docker start && /sbin/tini -- /usr/local/bin/jenkins.sh"]
docker-compose.yml内容
version: '3.1' services: s_jenkins: container_name: c_jenkins build: . image: recep/jenkins ports: - 8080:8080 - 50000:50000 volumes: - /home/recep/Desktop/docker_learn/jenkins/data:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock
容器日志
mkdir: cannot create directory ‘cpuset’: Read-only file system
解决方案
这个报错的核心原因是:你在容器内尝试启动Docker服务,但容器默认以只读方式挂载了/sys/fs/cgroup目录,Docker daemon启动时需要修改该目录下的cpuset相关内容,因此触发权限不足错误。
而实际上你完全不需要在容器内部启动Docker服务——你已经通过/var/run/docker.sock挂载了宿主机的Docker套接字,容器内的Docker客户端可以直接调用宿主机的Docker服务。
具体修改步骤:
调整Dockerfile:删除自定义的ENTRYPOINT,恢复Jenkins默认启动逻辑
FROM jenkins/jenkins USER root RUN apt-get update -qq && apt-get install -qqy apt-transport-https ca-certificates curl gnupg2 software-properties-common RUN curl -fsSL download.docker.com/linux/debian/gpg | apt-key add - RUN add-apt-repository \ "deb [arch=amd64] https://download.docker.com/linux/debian \ $(lsb_release -cs) \ stable" RUN apt-get update -qq && apt-get install -qqy docker-ce docker-ce-cli containerd.io RUN usermod -aG docker jenkins # 移除自定义ENTRYPOINT,使用Jenkins默认启动命令优化docker-compose配置:确保容器内用户能访问宿主机Docker套接字,可直接添加
user: root简化权限配置(生产环境建议调整宿主机套接字权限或映射用户ID)version: '3.1' services: s_jenkins: container_name: c_jenkins build: . image: recep/jenkins user: root ports: - 8080:8080 - 50000:50000 volumes: - /home/recep/Desktop/docker_learn/jenkins/data:/var/jenkins_home - /var/run/docker.sock:/var/run/docker.sock重新构建并启动容器
docker-compose down docker-compose build --no-cache docker-compose up -d
额外注意:检查宿主机上/home/recep/Desktop/docker_learn/jenkins/data目录的权限,确保容器内用户拥有读写权限,避免后续启动出现其他权限问题。
内容的提问来源于stack exchange,提问作者Recep Gunes
相关产品推荐
相关产品推荐

