如何在Dockerfile中升级pip?

4
在Dockerfile中,我们为Python项目构建镜像时,有一行代码用于升级pip到最新版本:
RUN pip install --upgrade pip

这个方法一直运行得很好,但最近镜像构建失败了,因为我们使用的是 Python 3.6.1 和最新版本的 pip(21.1),而最新版本的 pip 需要 Python >= 3.6.2,否则会出现 "ImportError: cannot import name NoReturn" 错误,详见 https://github.com/psf/black/issues/1666

除了升级 Python 版本以解决此问题外,我想知道在 Dockerfile 上下文中是否真的需要运行此命令来升级最新版本,因为这样做将无法获得可重复的镜像,由于 pip 版本将继续变化,这与 Docker 可重复环境的概念相违背。

那么,我们应该指定确切的 pip 版本以保持可重复的构建,即使这意味着某些时候它将过时?或者是否有其他选项可以确保当发布新的 pip 版本时,我们的镜像仍然能够正常工作?

1个回答

5

正如您所注意到的,在每次构建Docker镜像时升级pip到最新版本并不能保证未来的构建结果具有可重复性。这不是一个好主意。

采取的策略取决于您的需求。但是您可以考虑使用特定Python版本发布的默认pip版本,这是一个合理的选择。 但要选择这种方法,您需要确保您的主要Python版本(3.6)足够更新。这里并非如此,因为3.6.1是一个非常旧的版本。最新的3.6版本是3.6.13,已经在两个月前发布(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构建中更新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.

当您在系统上安装了pip时,此警告非常有用,在构建的docker镜像内部价值较小。有多种方法可以禁用此消息,请参见如何抑制pip升级警告?

CLI选项

pip --disable-pip-version-check [normal stuff here]

环境变量

export PIP_DISABLE_PIP_VERSION_CHECK=1

Pip 配置

pip config set global.disable-pip-version-check true

Pip配置文件(位于$HOME/.config/pip/pip.conf)

[global]
disable-pip-version-check = True

1
感谢提供详细信息!我们确实会坚持使用最新的pip版本来与3.6配合工作,并计划进行升级。 - piwai

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接