【问题标题】:Some python packages are not installed with docker but others are一些 python 包没有与 docker 一起安装,但其他包是
【发布时间】:2022-01-17 22:09:17
【问题描述】:

TL/DR

我有一个可怕的难题要解决,似乎在网络上的任何地方都没有解决,所以现在我将它发布在这里,以防其他人遇到同样的问题。已经解决了,请看下面我的回答。

它与pip install有关,而不是安装那些缺少轮子文件的软件包。


长解释。

在运行docker-compose up 时,在构建映像阶段,一切似乎都像魅力一样工作,没有报告任何错误...直到容器启动...然后我遇到了一些像这样的奇怪错误:

@@Traceback (most recent call last):
File "/usr/local/bin/flask", line 8, in <module>
sys.exit(main())
File "/usr/local/lib/python3.7/dist-packages/flask/cli.py", line 894, in main
cli.main(args=args, prog_name=name)
File "/usr/local/lib/python3.7/dist-packages/flask/cli.py", line 557, in main
return super(FlaskGroup, self).main(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/click/core.py", line 717, in main
rv = self.invoke(ctx)
File "/usr/local/lib/python3.7/dist-packages/click/core.py", line 1132, in invoke
cmd_name, cmd, args = self.resolve_command(ctx, args)
File "/usr/local/lib/python3.7/dist-packages/click/core.py", line 1171, in resolve_command
cmd = self.get_command(ctx, cmd_name)
File "/usr/local/lib/python3.7/dist-packages/flask/cli.py", line 500, in get_command
self._load_plugin_commands()
File "/usr/local/lib/python3.7/dist-packages/flask/cli.py", line 496, in _load_plugin_commands
self.add_command(ep.load(), ep.name)
File "/usr/local/lib/python3.7/dist-packages/pkg_resources/_init_.py", line 2464, in load
self.require(*args, **kwargs)
File "/usr/local/lib/python3.7/dist-packages/pkg_resources/_init_.py", line 2487, in require
items = working_set.resolve(reqs, env, installer, extras=self.extras)
File "/usr/local/lib/python3.7/dist-packages/pkg_resources/_init_.py", line 777, in resolve
raise DistributionNotFound(req, requirers)
pkg_resources.DistributionNotFound: The 'alembic>=0.6' distribution was not found and is required by the application

即使我在 docker 安装它们时没有遇到任何错误,但似乎丢失了许多包。

更奇怪的是:当使用docker run --rm -it --entrypoint bash &lt;service-name&gt; 进入容器时,我可以使用pip3 install -r /var/www/webapp/requirements.txt.lock 手动安装所有丢失的包,没有任何问题。所有的错误都会消失。这是我的 Dockerfile 在构建镜像时用来安装 python 包的完全相同的命令。

我们不知道:

  1. 为什么现在会发生这种情况,因为它至少在一对夫妇之前一直有效 过去 2 年的几周前!
  2. 为什么 dockerfile 失败,但手动运行完全相同的命令有效。
  3. 为什么只有某些包丢失,而没有为它们引发错误。
  4. 如何解决这个问题。

【问题讨论】:

    标签: python docker


    【解决方案1】:

    我开始研究,花了很多时间,但总结一下:

    1. 似乎丢失的软件包在其pypi 存储库中没有wheel 文件。所以 pip 落入"legacy" direct installation 但仅适用于那些包,这就是其他安装正确的原因。
    2. 我发现其中许多缺失的软件包,例如 alembic,确实有一个 .whl 文件,但在 later versions,而不是我们使用的那个:0.9.9
    3. 似乎需要 Wheel 包来为那些不包含在 pypi 存储库中的包构建 .whl 文件。但是在容器内执行pip list 表明确实已经安装了轮子......
    4. 我尝试手动删除 wheel 包,然后再次运行 pip3 install -r /var/www/webapp/requirements.txt.lock...瞧,与 docker 报告的错误相同。没有安装轮文件的软件包。于是我发现了那个轮子包:

    有两个不同的角色:

    1- 用于构建轮子的 setuptools 扩展,提供 bdist_wheel setuptools 命令

    2- 用于处理轮文件的命令行工具

    从这 2 点来看,第一点似乎是没有发生的事情。

    5.长话短说,在我的dockerfile中,在安装需求之前,我安装了wheel,问题解决了。


    但是为什么现在会发生这种情况而不是以前呢?

    我发现即使 docker 在运行 pip install 之前没有安装 wheel,它确实有 setuptools。我不完全知道这两个包是如何工作的,也不太了解它们是如何协同工作来完成工作的。但是在setuptools changelog上搜索我发现它的更新相当频繁,几乎每天都有。

    更有趣的是,2022 年 1 月 8 日的 v60.4.0 版本对于其他标准来说似乎相当大,它包括以下更改之一:

    #2968:删除了 tmp_src 测试夹具。以前这个夹具复制项目根目录下的所有文件和文件夹,包括 .git 目录,容易出错并增加测试时间。

    由于 tmp_src 用于填充虚拟环境(安装 通过源代码树测试的 setuptools 版本),它是 被新的 setuptools_sdist 和 setuptools_wheel 装置取代 (每个会话测试仅构建一次,并且可以共享 在所有工作人员之间进行只读使用)。

    不确定,但也许它确实改变了与没有 Wheel 文件的软件包的安装方式有关的东西,现在如果没有软件包 Wheel 这样做,它就无法工作。

    【讨论】:

      猜你喜欢
      • 2017-08-03
      • 1970-01-01
      • 1970-01-01
      • 2020-05-19
      • 2019-03-05
      • 1970-01-01
      • 1970-01-01
      • 2016-01-31
      • 2020-05-19
      相关资源
      最近更新 更多