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

Docker构建时pip升级setuptools遇[Errno39]目录非空错误求助

解决Python Slim镜像构建时Setuptools卸载目录非空错误

问题重现

使用以下Dockerfile构建镜像时:

FROM python:3.10-slim

ENV PYTHONUNBUFFERED 1

WORKDIR /app
COPY ./requirements.txt .

RUN pip install --trusted-host mirrors.aliyun.com --no-cache-dir --upgrade -r requirements.txt

出现如下错误:

Attempting uninstall: setuptools
    Found existing installation: setuptools 65.5.0
    Uninstalling setuptools-65.5.0:
ERROR: Could not install packages due to an OSError: [Errno 39] Directory not empty: '/usr/local/lib/python3.10/site-packages/_distutils_hack/'

即使Docker默认以root用户运行,仍出现该目录无法删除的问题。

解决方案

方案1:手动清理冲突目录后执行安装

在pip安装命令前,先强制删除_distutils_hack目录,避免卸载时的冲突:

FROM python:3.10-slim

ENV PYTHONUNBUFFERED 1

WORKDIR /app
COPY ./requirements.txt .

RUN rm -rf /usr/local/lib/python3.10/site-packages/_distutils_hack/ \
    && pip install --trusted-host mirrors.aliyun.com --no-cache-dir --upgrade -r requirements.txt

方案2:跳过setuptools的卸载流程

如果不需要强制升级现有setuptools,可在pip命令中添加--ignore-installed setuptools参数,跳过卸载步骤:

FROM python:3.10-slim

ENV PYTHONUNBUFFERED 1

WORKDIR /app
COPY ./requirements.txt .

RUN pip install --trusted-host mirrors.aliyun.com --no-cache-dir --upgrade --ignore-installed setuptools -r requirements.txt

方案3:改用完整Python镜像

Slim镜像为轻量化做了文件系统优化,可能导致部分目录存在特殊属性。若对镜像大小要求不高,可尝试使用完整版本的Python镜像:

FROM python:3.10

ENV PYTHONUNBUFFERED 1

WORKDIR /app
COPY ./requirements.txt .

RUN pip install --trusted-host mirrors.aliyun.com --no-cache-dir --upgrade -r requirements.txt

方案4:指定setuptools具体版本

在requirements.txt中明确指定一个高于现有版本的setuptools,让pip直接覆盖安装而非卸载后重装:
在requirements.txt中添加:

setuptools>=68.0.0

保持原Dockerfile不变,重新构建即可。

内容的提问来源于stack exchange,提问作者Yue JIN

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.07 16:10:33