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

使用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服务。

具体修改步骤:

  1. 调整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默认启动命令
    
  2. 优化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
    
  3. 重新构建并启动容器

    docker-compose down
    docker-compose build --no-cache
    docker-compose up -d
    

额外注意:检查宿主机上/home/recep/Desktop/docker_learn/jenkins/data目录的权限,确保容器内用户拥有读写权限,避免后续启动出现其他权限问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.28 06:05:07