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
相关产品推荐
相关产品推荐

