`pip install` 来自 python:3.6.8 容器中的自定义 python 包失败(但在容器外工作)

`pip install` a custom python package from within a python:3.6.8 container fails (but works outside the container)

我正在尝试使用 docker 官方 python:3.6.8 图像构建一个容器,该图像将封装我正在开发的 python 包及其依赖项。这个想法是使用 ADD mypkg.tar.gz /pytmp/mypkg 指令为容器提供代码存储库,然后创建一个 virtualenv 并从此环境中安装 mypkg,然后输出相应的 site-packages 目录以供稍后共享。

我的 Dockerfile 首先通过 apt-get 获得 virtualenv 然后创建虚拟环境并尝试在压缩之前安装包 site-packages:

RUN cd /pytmp && \
    virtualenv -p /usr/local/bin/python3 venv && \
    source venv/bin/activate && \
    pip install -v mypkg
RUN cd /pytmp/venv/lib/python3.6/ && \
    zip -r /python_packages.zip site-packages/

在我的系统 (ubuntu 18.04) 下,我可以从 mypkg 根目录做一个工作 pip install .。但是在容器内部,安装失败并出现错误

ERROR: Could not find a version that satisfies the requirement mypkg (from versions: none)

ERROR: No matching distribution found for mypkg

pip 是否在 pypi 上寻找 mypkg?我的指示有问题吗?

我正在使用仅 setup.cfg 的方案。 setup.cfg 包含以下内容

[options]
packages = find_namespace:
package_dir =
    =src
install_requires=
    numpy
    pyspark
    sklearn
    pylint
    pre-commit

[options.extras_require]
test = pytest
docs = Sphinx; sphinx-rtd-theme

[options.packages.find]
where=src

感谢您的帮助!

它可能会失败,因为您将它指向一个看起来像包名而不是目录的东西。确保你正在做 pip install /actual/path/to/your/package,至少在末尾有一个斜杠,可能需要完整路径,因为现在它将尝试从 PyPI 安装。

但是:您真的不应该分发 site-packages。对于库,只需分发您的 tarball。如果您要分发应用程序,完整的 Docker 图像可能有效,或者您可以使用 PyInstaller 或其他工具(https://pythonspeed.com/articles/distributing-software/ 进行了调查)。