【发布时间】:2019-04-07 03:18:04
【问题描述】:
我需要在一个自定义 Docker 容器中安装一个 Python 包,该容器是我从官方“ubuntu”Docker 镜像构建的,所以我想尽量减少它使用的空间。 Python3 可以正常安装并运行,但由于某种原因,不包括 pip。
所以我是通过apt install python3-pip 安装的,它可以工作,但它的容量高达 300 兆,并且需要几分钟才能安装(显然是因为它安装了大量的东西来从 gcc 等构建二进制包)。
当然,我可以在安装我想要的依赖项后从映像中卸载 python3-pip,另外使用apt autoremove 来摆脱 299 兆。然而,这需要一分钟。
因此,尽管上述方法有效,但它显着增加了我的 Docker 映像的构建时间。所以我试着看看是否有一种方法可以在没有 pip 的情况下安装依赖项:
我尝试从 PyPI 下载依赖项的 .tar.gz,提取并尝试了 python3 setup.py install,但这给我带来了一个奇怪的错误:
Traceback (most recent call last):
File "setup.py", line 59, in <module>
from distutils import log
ImportError: cannot import name 'log'
我想也许我需要安装 setuptools,或者升级 distutils。
我尝试使用官方网站上的get-pip.py,但也失败了:
Traceback (most recent call last):
File "get-pip.py", line 20890, in <module>
main()
File "get-pip.py", line 197, in main
bootstrap(tmpdir=tmpdir)
File "get-pip.py", line 82, in bootstrap
import pip._internal
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/__init__.py", line 40, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/autocompletion.py", line 8, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/main_parser.py", line 8, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/cli/cmdoptions.py", line 17, in <module>
File "/tmp/tmpjpa5gs_x/pip.zip/pip/_internal/locations.py", line 10, in <module>
ImportError: cannot import name 'sysconfig'
这很奇怪,因为如果我启动 python3,import sysconfig 工作正常。
我还尝试了apt install python-pyyaml(我在 Docker 映像中需要的依赖项),但这似乎不存在。
所以我别无选择。
【问题讨论】:
-
pip实际上确实需要所有这些(C 编译器和其他构建工具),因为 pip 包可能包含 C 代码或与二进制包链接。 -
是的,我知道为什么这些对于涵盖所有可能的构建/安装案例是必要的,对于一两个不需要 C (AFAIK) 的库来说似乎有点过分了。应该有一个用于纯 Python 包的“轻量级”版本的 pip,它的大小可能是 1/100。
标签: python-3.x docker ubuntu pip