【问题标题】:Why use requirements.txt in a Docker image为什么在 Docker 镜像中使用 requirements.txt
【发布时间】:2021-06-05 07:14:51
【问题描述】:

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

编辑:这是在开发仅在内部 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 中阅读了同事的 dockerfile,并且必须导航到需求,我在本地的编辑器中没有它。 EDIT3:自我注意:所以克隆它并在编辑器中查看它。

【问题讨论】:

  • simple, "更好的维护" ,你不需要去 docker 文件看看在 docker env 中安装哪个包在单个或多个 lvl
  • 还有一个 requirements.txt 允许你设置你的本地开发机器以及其他任何愿意贡献的人
  • @sahasrara62,如果您正在查看 Dockerfile,则无需访问 requirements.txt。还有 requirements.txt 你可以不用。我不知道你所说的单级/多级是什么意思,这可能就是我没有得到你所看到的优势的原因。
  • 将它保存在 Dockerfile 中有什么好处?但是,如果您将需求放在 reqs.txt 中,则更容易一目了然地准确了解需求。
  • @LevinMagruder 单/多均值,单/多级 docker env 设置。另外,假设我不想在我的项目中实现/使用 Docker,那么我怎么知道要安装哪个包?所以 requirements.txt 帮助我们维护所有包并将它们安装在任何环境、生产阶段或开发或 docker 一中,而无需为不同的环境修改/编写不同的包/版本

标签: python docker docker-compose pip requirements.txt


【解决方案1】:

首先考虑使用工具流程:

  • 要在 Docker 容器内部或外部手动安装这些软件包,或者在不构建新 Docker 映像的情况下测试其是否正常工作,请执行 pip install -r requirements.txt。您不必复制/粘贴软件包列表。
  • 要“冻结”特定版本的包以使构建更具可重复性,pip freeze 将为您创建(或扩充)requirements.txt 文件。
  • PyCharm 将查找 requirements.txt 文件,如果您当前安装的软件包与该规范不匹配,则通知您,帮助您修复该问题,显示更新的软件包是否可用,并帮助您进行更新。
  • 大概其他现代 IDE 也这样做,但如果您在纯文本编辑器中进行开发,您仍然可以运行这样的脚本来检查已安装的包(这在 git post-checkout 挂钩中也很方便):
    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 中相比,将其分开保存更加模块化和可重复使用。

【讨论】:

    【解决方案2】:

    这是一个单一职责的问题。

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

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


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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2015-09-22
      • 1970-01-01
      • 2018-02-10
      • 2020-09-24
      • 1970-01-01
      • 2015-05-19
      • 2013-09-07
      • 2019-11-17
      相关资源
      最近更新 更多