如何在 dockerfile 中升级 pip?

piw*_*wai 4 python pip docker

在我们为 python 项目构建镜像的 Dockerfile 中,我们有这样一行将 pip 升级到最新版本:

RUN pip install --upgrade pip
Run Code Online (Sandbox Code Playgroud)

这已经工作了一段时间了,但最近图像构建开始失败,因为我们使用的是 python 3.6.1,最新版本的 pip (21.1) 现在需要 python >= 3.6.2,否则你会得到一个“ImportError:不能导入名称 NoReturn”,参见https://github.com/psf/black/issues/1666

除了升级我们的 Python 版本来解决这个问题之外,我想知道我们是否真的应该运行这个命令来在 Dockerfile 上下文中升级最新版本,因为这样做时我们不再获得可重现的图像,因为 pip 版本将继续移动,这违背了 Docker 可重现环境的概念。

那么,我们是否应该指定确切的 pip 版本以保持可重现的构建,即使这意味着在某些时候它会过时?或者是否有另一种选择可以确保我们的图像在新的 pip 版本发布时继续工作?

Ant*_*ane 5

正如您所注意到的,在 Docker 映像的每个构建上将 pip 升级到最新版本并不能保证将来能够重现构建。这不是一个好主意。

采用的策略取决于您的需求。但您可能认为随特定 Python 版本发布的默认 pip 版本是合理的。但要选择它,您可以确保您的主要 Python 版本 (3.6) 足够最新。这不是您的情况,因为 3.6.1 是一个非常旧的版本。最新的3.6是3.6.13,已经发布2个月了(仍然支持3.6)

来自https://www.python.org/downloads/

  • Python 3.6.13:2021 年 2 月 15 日
  • Python 3.6.2:2017 年 7 月 17 日
  • Python 3.6.1:2017 年 3 月 21 日

在 docker build 上更新 pip 的原因通常是当 Pip 不是最新版本时显示的警告

You are using pip version 6.0.8, however version 8.1.1 is available.
You should consider upgrading via the 'pip install --upgrade pip' command.
Run Code Online (Sandbox Code Playgroud)

当您的系统上有 pip 时,此警告很有用,它在构建的 docker 映像中的价值较小。有多种方法可以禁用此消息,请参阅如何抑制 pip 升级警告?:

CLI 选项

pip --disable-pip-version-check [normal stuff here]
Run Code Online (Sandbox Code Playgroud)

环境变量

export PIP_DISABLE_PIP_VERSION_CHECK=1
Run Code Online (Sandbox Code Playgroud)

点配置

pip config set global.disable-pip-version-check true
Run Code Online (Sandbox Code Playgroud)

Pip 配置文件(在 $HOME/.config/pip/pip.conf 中)

[global]
disable-pip-version-check = True
Run Code Online (Sandbox Code Playgroud)