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 0docker build .构建镜像,如果构建成功即可确认是SELinux策略拦截导致,按如下方式修复,不要长期关闭SELinux:- 给项目目录递归设置容器可访问的SELinux标签,替换命令中的路径为你项目的实际绝对路径:
sudo chcon -Rt container_file_t /path/to/your/django/project - 修复完成后将SELinux切回强制安全模式:
sudo setenforce 1
- 给项目目录递归设置容器可访问的SELinux标签,替换命令中的路径为你项目的实际绝对路径:
- 检查Docker数据目录挂载参数
执行以下命令查看/var/lib/docker的挂载选项:
如果输出的OPTIONS列包含findmnt /var/lib/dockernoexec参数,按如下步骤修复:- 编辑
/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.
相关产品推荐
相关产品推荐

