【问题标题】:Why doesn't pip inside my Docker container install pre-compiled packages?为什么我的 Docker 容器中的 pip 不安装预编译包?
【发布时间】:2021-02-21 20:47:13
【问题描述】:

在我的主机上安装 scipy:

❯ 点安装 scipy 收集 scipy 下载 scipy-1.5.4-cp38-cp38-manylinux1_x86_64.whl (25.8 MB) |████████████████████████████████| 25.8 MB 2.4 MB/秒 已满足要求:/home/tomas/.pyenv/versions/3.8.2/envs/3.8.2@appdaemon/lib/python3.8/site-packages 中的 numpy>=1.14.5(来自 scipy)(1.19.4 ) 安装收集的包:scipy 成功安装 scipy-1.5.4

尝试在我的 Docker 容器中安装 scipy (acockburn/appdaemon:latest):

/conf # pip install scipy 收集 scipy 下载 scipy-1.5.4.tar.gz (25.2 MB) |████████████████████████████████| 25.2 MB 274 KB/秒 安装构建依赖项...完成 获得制造轮子的要求......完成 正在准备车轮元数据...错误 错误:命令出错,退出状态为 1: 命令:/usr/local/bin/python /usr/local/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py prepare_metadata_for_build_wheel /tmp/tmpdj2d13lc cwd:/tmp/pip-install-o5ltw_ig/scipy 完整输出(139 行): lapack_opt_info: lapack_mkl_info: 自定义 UnixCCompiler 在 ['/usr/local/lib', '/usr/lib', '/usr/lib/'] 中找不到库 mkl_rt 无法使用 openblas_lapack_info: 自定义 UnixCCompiler 自定义 UnixCCompiler 在 ['/usr/local/lib', '/usr/lib', '/usr/lib/'] 中找不到库 openblas 无法使用 openblas_clapack_info: 自定义 UnixCCompiler 自定义 UnixCCompiler 库 openblas,lapack 在 ['/usr/local/lib', '/usr/lib', '/usr/lib/'] 中找不到 无法使用 火焰信息: 自定义 UnixCCompiler 在 ['/usr/local/lib', '/usr/lib', '/usr/lib/'] 中找不到库火焰 无法使用 atlas_3_10_threads_info: 设置 PTATLAS=ATLAS 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 tatlas,在 /usr/local/lib 中找不到 tatlas 自定义 UnixCCompiler 在 /usr/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 tatlas,在 /usr/lib 中找不到 tatlas 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 tatlas,在 /usr/lib/ 中找不到 tatlas 无法使用 atlas_3_10_info: 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 satlas,satlas 在 /usr/local/lib 中找不到 自定义 UnixCCompiler 在 /usr/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 satlas,satlas 在 /usr/lib 中找不到 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 lapack_atlas 自定义 UnixCCompiler 库 satlas,satlas 在 /usr/lib/ 中找不到 无法使用 atlas_threads_info: 设置 PTATLAS=ATLAS 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 ptf77blas、ptcblas、atlas 自定义 UnixCCompiler 在 /usr/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/lib 中找不到库 ptf77blas、ptcblas、atlas 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 ptf77blas、ptcblas、atlas 无法使用 地图集信息: 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/local/lib 中找不到库 f77blas、cblas、atlas 自定义 UnixCCompiler 在 /usr/lib 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/lib 中找不到库 f77blas、cblas、atlas 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 lapack_atlas 自定义 UnixCCompiler 在 /usr/lib/ 中找不到库 f77blas、cblas、atlas 无法使用 加速信息: 无法使用 拉包信息: 自定义 UnixCCompiler 在 ['/usr/local/lib', '/usr/lib', '/usr/lib/'] 中找不到库 lapack 无法使用 lapack_src_info: 无法使用 无法使用 setup.py:460: UserWarning: Unrecognized setuptools command ('dist_info --egg-base /tmp/pip-modern-metadata-ksceopr3'),继续生成 Cython 源和扩展模板 warnings.warn("无法识别的 setuptools 命令 ('{}'),继续 " 从 SciPy 源目录运行。 /tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/numpy/distutils/system_info.py:1712:用户警告: 未找到 Lapack (http://www.netlib.org/lapack/) 库。 搜索库的目录可以在 numpy/distutils/site.cfg 文件([lapack] 部分)或通过设置 LAPACK 环境变量。 如果 getattr(self, '_calc_info_{}'.format(lapack))(): /tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/numpy/distutils/system_info.py:1712:用户警告: 未找到 Lapack (http://www.netlib.org/lapack/) 源。 搜索源的目录可以在 numpy/distutils/site.cfg 文件([lapack_src] 部分)或通过设置 LAPACK_SRC 环境变量。 如果 getattr(self, '_calc_info_{}'.format(lapack))(): 回溯(最近一次通话最后): 文件“/usr/local/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py”,第 257 行,在 主要的() 文件“/usr/local/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py”,第 240 行,在 main json_out['return_val'] = hook(**hook_input['kwargs']) 文件“/usr/local/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py”,第 110 行,在 prepare_metadata_for_build_wheel 返回挂钩(元数据目录,配置设置) 文件“/tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/setuptools/build_meta.py”,第 161 行,在 prepare_metadata_for_build_wheel self.run_setup() 文件“/tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/setuptools/build_meta.py”,第 253 行,在 run_setup 超级(_BuildMetaLegacyBackend, 文件“/tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/setuptools/build_meta.py”,第 145 行,在 run_setup exec(编译(代码,__file__,'exec'),locals()) 文件“setup.py”,第 583 行,在 setup_package() setup_package 中的文件“setup.py”,第 579 行 设置(**元数据) 文件“/tmp/pip-build-env-4401a2iy/overlay/lib/python3.8/site-packages/numpy/distutils/core.py”,第 137 行,在设置中 配置 = 配置() 文件“setup.py”,第 477 行,在配置中 引发 NotFoundError(msg) numpy.distutils.system_info.NotFoundError:未找到 lapack/blas 资源。 -------------------------------------- 错误:命令出错,退出状态为 1:/usr/local/bin/python /usr/local/lib/python3.8/site-packages/pip/_vendor/pep517/_in_process.py prepare_metadata_for_build_wheel /tmp/tmpdj2d13lc 检查日志完整的命令输出。

同样的事情发生在 numpy 上。

我的 Docker 容器和主机使用完全相同的 CPython 版本 (3.8.2) 并且都是 x86_64。为什么两个地方都没有安装预编译库?这是我能控制的吗?

【问题讨论】:

  • 您缺少这些库,请尝试将它们安装到您的容器中?
  • @hd1 对,但关键是 pip 没有安装预编译库。我不想修改 Docker 映像,因为这会使我的设置复杂化。
  • @Hubro 如果您使用的是 alpine 或类似的发行版,则必须在实际运行 pip 之前安装许多操作系统级别的依赖项ScipyNumpy 依赖于它们。
  • 比如在alpine安装Python依赖之前,我要运行RUN apk update \ && apk add --no-cache bash libxml2-dev libxslt-dev gcc python3-dev linux-headers musl-dev openssl-dev libffi-dev build-base
  • @dmitryro Dang... 这破坏了我不修改原始图像的整个计划...哦,好吧:(

标签: python docker numpy scipy pip


【解决方案1】:

原来 Docker 与它无关,而是与它内部运行的操作系统有关。我使用的 Docker 镜像基于 Alpine,它使用 musl libc 而不是 glibc。所有 Python 预编译的库都是为 glibc 编译的,至少现在是这样,所以 Alpine 用户不走运。

https://github.com/pypa/manylinux/issues/37

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2022-11-14
    • 1970-01-01
    • 1970-01-01
    • 2013-01-15
    • 2021-10-22
    • 1970-01-01
    • 2021-12-25
    相关资源
    最近更新 更多