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

Fedora 36下Docker构建Django镜像RUN pip权限报错咨询

Fedora 36 构建Django Docker镜像时/bin/sh: permission denied报错解决方案

核心诱因

该报错出现在Dockerfile的RUN指令执行阶段,本质是宿主机配置阻止了构建临时容器启动shell进程,和镜像内文件权限无关,常见触发原因有两个:

  • Fedora 36默认开启SELinux强制访问控制,对容器进程的访问约束较严格。如果存放Dockerfile的项目目录没有配置正确的SELinux容器标签,构建阶段COPY文件、启动容器内进程的操作会被SELinux拦截,导致无法执行/bin/sh,最终返回非0退出码。
  • Docker默认数据目录/var/lib/docker所在的磁盘分区被设置了noexec挂载参数,内核会直接阻止该分区下所有可执行文件的运行,容器内的shell、pip等程序都无法启动。
    另外你的Dockerfile存在一处不影响权限但会导致pip提示冗余告警的笔误:环境变量PIP-DISABLE_PIPVERSION_CHECK的分隔符写错了,正确写法应为下划线分隔。

注意:不要尝试在Dockerfile中添加chmod +x /bin/sh类指令修复,该操作完全无效,问题根源在宿主机侧配置。

排查解决步骤

按以下顺序操作即可修复:

  • 验证SELinux是否为故障根因
    执行以下命令临时将SELinux切换为宽容模式:
    sudo setenforce 0
    
    重新执行docker build .构建镜像,如果构建成功即可确认是SELinux策略拦截导致,按如下方式修复,不要长期关闭SELinux:
    • 给项目目录递归设置容器可访问的SELinux标签,替换命令中的路径为你项目的实际绝对路径:
      sudo chcon -Rt container_file_t /path/to/your/django/project
      
    • 修复完成后将SELinux切回强制安全模式:
      sudo setenforce 1
      
  • 检查Docker数据目录挂载参数
    执行以下命令查看/var/lib/docker的挂载选项:
    findmnt /var/lib/docker
    
    如果输出的OPTIONS列包含noexec参数,按如下步骤修复:
    • 编辑/etc/fstab文件,找到对应分区的挂载配置行,删除noexec参数,保留defaults配置或显式添加exec参数
    • 重新挂载分区使配置生效:
      sudo mount -o remount /var/lib/docker
      
    • 重启Docker服务:
      sudo systemctl restart docker
      
  • 修正Dockerfile笔误
    将错误的PIP环境变量行替换为正确写法,修正后完整Dockerfile如下:
    # 拉取基础镜像
    FROM python:3.10.4-slim-bullseye
    # 设置环境变量
    ENV PIP_DISABLE_PIP_VERSION_CHECK 1
    ENV PYTHONDONTWRITEBYTECODE 1
    ENV PYTHONUNBUFFERED 1
    
    # 设置工作目录
    WORKDIR /code
    
    # 安装依赖
    COPY ./requirements.txt .
    RUN pip install -r requirements.txt
    
    # 复制项目代码
    COPY . .
    
  • 清理构建缓存后重新构建
    执行以下命令清理旧的失效构建缓存,再重新运行构建命令即可:
    docker system prune -f
    

内容的提问来源于stack exchange,提问作者Mike C.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.29 16:34:47