Docker中为Python 3.11安装pip报错:找不到get-pip.py文件
问题分析与解决
核心错误原因
你用了curl -sS -O https://bootstrap.pypa.io/get-pip.py | python3.11这个命令,这里的管道|会直接把curl的输出传给Python执行,不会将get-pip.py文件保存到容器的文件系统中,所以下一个RUN python3.11 get-pip.py自然找不到文件。
修正后的Dockerfile
直接把curl的输出通过管道传给Python执行即可,同时还需要修复其他几个影响镜像构建和运行的问题:
# 使用Ubuntu 20.04基础镜像 FROM ubuntu:20.04 # 避免交互式弹窗 ENV TZ=Europe \ DEBIAN_FRONTEND=noninteractive # 更新系统并安装依赖包 RUN apt-get update \ && apt-get install -y --no-install-recommends \ tzdata \ build-essential \ checkinstall \ libreadline-gplv2-dev \ libncursesw5-dev \ libssl-dev \ libsqlite3-dev \ tk-dev \ libgdbm-dev \ libc6-dev \ libbz2-dev \ software-properties-common \ && add-apt-repository ppa:deadsnakes/ppa \ && apt-get update \ && apt-get install -y --no-install-recommends python3.11 \ && apt-get clean \ && rm -rf /var/lib/apt/lists/* # 直接通过管道安装pip,无需保存文件 RUN curl -sS https://bootstrap.pypa.io/get-pip.py | python3.11 # 安装指定版本的Poetry ENV POETRY_VERSION 1.4.2 RUN python3.11 -m pip install "poetry==$POETRY_VERSION" # 设置工作目录为Django项目根目录 WORKDIR /website # 复制依赖配置文件,利用Docker缓存 COPY pyproject.toml poetry.lock ./ # 安装项目依赖(生成虚拟环境在容器内) RUN poetry install --no-root # 复制整个Django项目代码 COPY . . # 直接用poetry run启动Django服务,无需进入shell CMD ["poetry", "run", "python", "manage.py", "runserver", "0.0.0.0:8000"]
关键修正点说明
- pip安装:去掉
-O参数和后续的python3.11 get-pip.py,直接用curl ... | python3.11执行安装,彻底解决文件找不到的问题。 - WORKDIR位置:提前设置
WORKDIR /website,确保复制配置文件后,poetry能正确读取pyproject.toml和poetry.lock。 - Poetry使用:用
poetry install --no-root先安装依赖,再复制项目代码,利用Docker缓存机制,避免每次代码变更都重新安装依赖;替换交互式的poetry shell为poetry run直接启动服务,符合Docker非交互式运行的要求。 - 镜像优化:添加
apt-get clean和rm -rf /var/lib/apt/lists/*清理系统缓存,减小镜像体积。
内容的提问来源于stack exchange,提问作者WideWood
相关产品推荐
相关产品推荐

