去年有一个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 中阅读了同事的 dockerfiles 并且必须导航到要求,我在本地编辑器中没有它。 EDIT3:自我注意:克隆它并在编辑器中查看它。
答案 0 :(得分:1)
这是一个单一责任的问题。
Dockerfile
的工作是将应用程序打包成镜像。也就是说:它应该描述将应用程序转换为容器映像所需的每一步。
requirements.txt
的工作是列出 Python 应用程序的每个依赖项,无论其部署策略如何。许多 Python 工作流需要一个 requirements.txt 并且知道如何在更新该 requirements.txt 文件时添加新的依赖项。许多其他工作流至少可以与 requirements.txt 互操作。他们都不知道如何自动填充 Dockerfile。
简而言之,如果应用程序不包含requirements.txt,则它是不完整的。在 Dockerfile 中包含这些信息就像编写文档,教您的操作人员如何在部署应用程序时提取和安装每个单独的依赖项,而不是将其包含在依赖项管理器中,然后打包到您交付给操作员的二进制文件中。
答案 1 :(得分:1)
首先考虑顺应工具流程:
pip install -r requirements.txt
。您无需复制/粘贴软件包列表。pip freeze
将为您创建(或扩充)该 requirements.txt
文件。requirements.txt
文件,让您知道您当前安装的软件包是否与该规范不匹配,帮助您修复该问题,显示更新的软件包是否可用,并帮助您更新。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
中相比,将其分开更模块化且可重用。