【问题标题】:How can I upgrade pip inside a venv inside a Dockerfile?如何在 Dockerfile 中的 venv 中升级 pip?
【发布时间】:2026-02-06 14:55:01
【问题描述】:

运行时

$ sudo docker build -t myproj:tag .

我被消息击中

You are using pip version 10.0.1, however version 18.0 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.

并且考虑到最近偶尔会出现错误:

"/usr/bin/pip" "from pip import main" "ImportError: cannot import .."

我宁愿放弃并确实升级。

所以我在DockerFile 中添加了pip upgrade 命令, venv 构建之后,因为重要的pip 是venv 内部的那个(我说对了吗? ?)。所以我的 Dockerfile 现在有了这个:

...
RUN python -m venv venv
RUN pip install --upgrade pip
...

但这样做并不能避免“您正在使用 pip 10.x”消息。我错过了什么?

更新

虽然是一个很有希望的建议,但也不是

RUN source venv/bin/activate
RUN pip install --upgrade pip

也没有

RUN source venv/bin/activate
RUN python -m pip install --upgrade pip

消除“您正在使用 pip 版本 10.0.1,...”消息。

【问题讨论】:

  • 你能分享更多你的 Dockerfile 吗?喜欢更多RUNCMD 行吗?

标签: python pip dockerfile python-venv


【解决方案1】:

对此最简单的答案就是不要在 Docker 映像中使用虚拟环境。虚拟环境为您提供了一个隔离的文件系统空间,其中包含一组与系统安装不冲突的私有 Python 包,但 Docker 映像也是如此。你可以在 Docker 镜像中使用系统 pip 就可以了。

FROM python:3.7
RUN pip install --upgrade pip
WORKDIR /usr/src/app
COPY . .
RUN pip install .
CMD ["myscript"]

如果你真的想要一个虚拟环境,你要么需要专门从虚拟环境的路径运行包装脚本

RUN python -m venv venv
RUN venv/bin/pip install --upgrade pip

或在每个 RUN 命令上运行虚拟环境“激活”脚本;它设置的环境变量不会从一个步骤延续到另一个步骤。 (实际上,每个 RUN 命令都会在后台执行自己的 docker run; docker commit 序列,并将在新容器中启动新的 shell;Dockerfile reference 对此进行了一些描述。)

RUN python -m venv venv
RUN . venv/bin/activate \
 && pip install --upgrade pip
COPY . .
RUN . venv/bin/activate \
 && pip install .
CMD ["venv/bin/myscript"]

尝试在其自己的 RUN 指令中激活虚拟环境除了生成一个无操作层之外没有任何作用。

# This step does nothing
RUN . venv/bin/activate
# And therefore this upgrades the system pip
RUN pip install --upgrade pip

【讨论】:

  • 非常好,非常有说服力。仍然(除了您听起来很权威)您能否提供参考或一些推理,以说明 Dockerfile 中的每个命令都会产生自己的 shell,特别是进入虚拟环境将是暂时的这一一般原则?如果所有这些结合在一起,最大的教训是不能在实际命令行上空运行一组命令,然后将它们复制到 Dockerfile。
  • 我添加了一小部分来描述 RUN 的真正作用。我在 Docker 文档中找不到我正在寻找的确切措辞(它一直使用“层”),但至少提到 RUN command 在单独的外壳中这样做。
【解决方案2】:

在你可以使用你的虚拟环境之前venv你需要激活它

在 Windows 上:

venv\Scripts\activate.bat

在 Unix 或 MacOS 上,运行:

source venv/bin/activate

请注意,venv 是您的环境的名称。您使用RUN python -m venv venv 创建了这个环境。我强烈建议使用其他名称。

然后你可以用python -m pip install --upgrade pip升级

【讨论】:

    【解决方案3】:

    在通过 Docker 容器创建虚拟环境后

    RUN python -m venv venv
    

    然后运行任一

    RUN venv/bin/pip install --upgrade pip
    

    RUN venv/bin/python -m pip install --upgrade pip
    

    但都没有

    RUN pip install --upgrade pip
    

    也没有

    RUN python -m pip install --upgrade pip
    

    【讨论】: