为什么在 Docker 图像中使用 requirements.txt

Why use requirements.txt in a Docker image

去年有一个,但我认为这些回复没有广泛适用,因此不被接受。

编辑:这是在开发小型工作的背景下,这些工作只会在 docker 内部进行 运行;我不是在谈论与小团队以外的任何人共享工作,也不是在谈论项目得到大量重用。

您认为在 Dockerfile 中使用 requirements.txt 安装而不是 pip install 命令有什么优势?我看到一个:你的各种项目的 Dockerfile 更千篇一律。

我什至没有考虑使用我链接的问题中设想的设置。

在 Dockerfile 中命名包有什么缺点:

 RUN   pip install --target=/build  django==3.0.1 Jinja2==2.11.1 .  . . 

编辑 2:@superstormer 问“将它放入 Dockefile 有什么好处”——公平的问题。我在 Gitlab 中阅读了同事的 docker 文件并且必须导航到要求,我没有在编辑器中本地。 EDIT3:自我注意:所以克隆它并在编辑器中查看它。

这是单一职责的问题。

Dockerfile 的工作是将要构建的应用程序打包为图像。即:它应该描述将应用程序变成容器镜像所需的每个步骤。

requirements.txt 的工作是列出 Python 应用程序的每个依赖项,无论其部署策略如何。许多 Python 工作流程需要 requirements.txt 并且知道如何在更新 requirements.txt 文件时添加新的依赖项。许多其他工作流至少可以与 requirements.txt 互操作。 None 他们知道如何自动填充 Dockerfile。


简而言之,如果不包含 requirements.txt,则应用程序不完整。在 Dockerfile 中包含该信息就像编写文档,教您的运维人员如何在部署应用程序时拉取和安装每个单独的依赖项,而不是将其包含在依赖项管理器中,然后打包到您交付给操作员的二进制文件中。

首先考虑顺应工具流程:

  • 要在 Docker 容器内部或外部手动安装这些包,或者要测试它是否可以在不构建新的 Docker 图像的情况下工作,请执行 pip install -r requirements.txt。您不必 copy/paste 软件包列表。
  • 为了“冻结”特定版本的包以提高构建的可重复性,pip freeze 将为您创建(或扩充)该 requirements.txt 文件。
  • PyCharm 将查找 requirements.txt 文件,让您知道当前安装的软件包是否不符合该规范,帮助您解决问题,显示更新的软件包是否可用,以及帮你更新。
  • 大概其他现代 IDE 也做同样的事情,但是如果你在纯文本编辑器中开发,你仍然可以 运行 这样的脚本来检查已安装的包(这在 git post-结帐挂钩):
    echo -e "\nRequirements diff (requirements.txt vs current pips):"
    diff --ignore-case <(sed 's/ *#.*//;s/^ *--.*//;/^$/d' requirements.txt | sort --ignore-case) \
      <(pip freeze 2>/dev/null | sort --ignore-case) -yB --suppress-common-lines
    

希望这能让人更清楚 requirements.txt 声明所需的包,通常是包版本。与将其嵌入 Dockerfile.

相比,它更加模块化和可重用,以保持独立