【问题标题】:Pip3 is unable to install requirements.txt during docker buildPip3 在 docker build 期间无法安装 requirements.txt
【发布时间】:2021-08-20 05:50:04
【问题描述】:

我正在使用 docker 教程 (https://docs.docker.com/language/python/build-images/) 来构建一个简单的 python 应用程序。使用freeze 命令我制作了requirements.txt 文件,其中包含很多包。

当我想构建 docker 镜像时,我收到了这个错误:

步骤 4/6 : RUN pip3 install -r requirements.txt ---> 运行 f92acd21d271

错误:找不到满足要求的版本 apt-clone==0.2.1(来自版本:无)

错误:未找到 apt-clone==0.2.1 的匹配分布

命令“/bin/sh -c pip3 install -r requirements.txt”返回一个 非零代码:1

这是我的 dockerfile 内容(与教程中提到的相同):

# syntax=docker/dockerfile:1
FROM python:3.8-slim-buster
WORKDIR /app
COPY requirements.txt requirements.txt
RUN pip3 install -r requirements.txt
COPY . .
CMD [ "python3", "-m", "flask","run","--host=0.0.0.0" ]

它与 apt-clone==0.2.1 包无关。无论我尝试在 docker 映像中安装什么,它都会失败。我也尝试过 apt update 并在 dockerfile 中安装 pip3,但没有成功。

我错过了什么?

【问题讨论】:

  • 尝试以交互模式 docker run -it --rm python:3.8-slim-buster 重新创建 Dockerfile 中的步骤。这通常对我有帮助(非 Py 项目)。如果您需要详细说明,请告诉我。它不适合 cmets
  • @kevinnls 您能否详细说明您的想法作为答案?
  • 他基本上是指docker run --rm -it python:3.8-slim-buster --name something bash,然后手动docker cp requirements.txt something:/app等来追踪Dockerfile的步骤。
  • 是的......并通过各种故障排除步骤。但我们已经有了答案:) 干杯! ??????

标签: python docker pip dockerfile


【解决方案1】:

pip3 freeze输出当前环境下安装的包及其版本,无论pip或其他方式安装的包。

其实apt-clone==0.2.1来自debian package repo,而不是来自pypi.org,见下:

$ pip3 freeze | grep apt-clone
$ apt-get install -y apt-clone
$ dpkg -l apt-clone
Desired=Unknown/Install/Remove/Purge/Hold
| Status=Not/Inst/Conf-files/Unpacked/halF-conf/Half-inst/trig-aWait/Trig-pend
|/ Err?=(none)/Reinst-required (Status,Err: uppercase=bad)
||/ Name           Version      Architecture Description
+++-==============-============-============-=================================
ii  apt-clone      0.4.1        all          Script to create state bundles
$  dpkg -L apt-clone
/.
/usr
/usr/share
/usr/share/doc
/usr/share/doc/apt-clone
/usr/share/doc/apt-clone/copyright
/usr/share/doc/apt-clone/changelog.gz
/usr/share/man
/usr/share/man/man8
/usr/share/man/man8/apt-clone.8.gz
/usr/lib
/usr/lib/python3
/usr/lib/python3/dist-packages
/usr/lib/python3/dist-packages/apt_clone.py
/usr/lib/python3/dist-packages/apt_clone-0.2.1.egg-info
/usr/bin
/usr/bin/apt-clone
$ pip3 freeze | grep apt-clone
apt-clone==0.2.1

从上面可以看到,apt_clone.py&apt_clone-0.2.1.egg-info是debian包apt-clone安装的,0.4.1是debian包版本,0.2.1是python包版本。

因此,对于apt-clone 类似,您需要使用apt 安装它们,尽管它们在pip3 freeze 中可见。

【讨论】:

  • dpkg -L apt-clone我们可以看到apt-clone.deb被安装了什么,/usr/lib/python3/dist-packages/apt_clone.py & /usr/lib/python3/dist-packages/apt_clone-0.2.1.egg-info意味着它们是python包。
  • 是的,正如@tripleee 指出的那样,这些是 debian 包而不是 python 包,但显然关键是“pip freeze”不是构建 docker 映像的好工具。
  • apt-clone.deb当然不是python包,但是解压到/usr/lib/python3/dist-packages后就变成了python包。可以通过删除/usr/lib/python3/dist-packages/apt_clone-0.2.1.egg-info进行验证,删除egg info后,pip3 freeze中不再显示。
  • 除非不要在生产系统上乱用/usr/lib 的内容。
  • 删除egg-info只是为了让你验证这真的是一个python包,因为你认为它不是你的cmets中的python包。确认是python包后,就可以理解为什么会显示在pip freeze中了。但是,是的,您不应该尝试删除所有egg-info,因为您甚至无法确认删除哪个或不删除哪个。不过,解决方案是:您需要知道您的环境需要什么包,并编写自己的 requirements.txt。
【解决方案2】:

公共 PyPI 存储库中没有名为 apt-clone 的包,所以 pip3 显然找不到它。

如果你真的有一个像这样命名的 Python 包,它是从哪里来的?

  • 如果您在本地创建了一个具有此名称的包,您还需要以某种方式将其安装到您的 Docker 映像中。

  • 如果你在一个组织内部,也许你有一个本地 PyPI,它的包与公共包不同,然后你需要配置 pip3 来使用它(试试pip3 -i http://your.local.pypi/simple -r requirements.txt,显然 URL 需要是别的东西,但我们猜不出是什么)。

如果pip3 freeze 说你有这个包,它一定来自某个地方,但我们不知道在哪里。您必须弄清楚这一点,或者提供更多详细信息来帮助我们帮助您。

有一个名为apt-clone 的Debian 软件包,但这显然不是pip 可以安装的。你真的是说apt-get install -y apt-clone==0.2.1吗? (不过,我只能在 Debian Buster 中找到 0.4.1 版本。)

...@atline 的回答解释了发生的事情(您可能应该接受),但简单的解决方法是使用您的实际 要求手动填充 requirements.txt。如果您在虚拟环境中,pip3 freeze 是一个很好的简写,但它不是手动策划的 requirements.txtsetup.py 的合适替代品(或其现代替代品,目前从 setup.cfg 移动到 pyproject.toml )。如果flask 是您的应用程序需要的唯一包,只需输入pip3 install flask 而不要创建requirements.txt

【讨论】:

  • 感谢您的解释。我没有把 apt-clone 放在列表中,我只是做了一个“pip3 freeze”来制作列表,它列出了 apt-clone==0.2.1!正如我所提到的,如果我删除了这个包,下一个也存在同样的错误(比如 apturl==0.5.2)等等
  • 同样,没有名为 apturl 的公共 PyPI 包,但有一个具有该名称的 Ubuntu 包。我只能推测pip freeze 将如何提出外部世界未知的包名称,并且已经在这个答案中这样做了。您最初是如何构建运行 pip3 freeze 的环境的?
  • 是的,显然我在我的操作系统(mint 20)上安装的包和 python 包之间存在不匹配,但我想知道我应该怎么做才能解决它!我唯一做的就是冻结命令(与我提到的文档完全相同)
  • 关于有问题的包的数量我想知道为什么docker网站没有考虑这种情况。
  • 可能应该更清楚一点,但这是常见的做法。
猜你喜欢
  • 2023-01-19
  • 1970-01-01
  • 1970-01-01
  • 2018-08-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2020-09-09
相关资源
最近更新 更多