在 Alpine Linux 中使用 Python 与 apk 一起安装的包
Use Python package installed with apk in Alpine Linux
我想使用 apk 在 Alpine Linux 中安装一些 Python 包。下面我以numpy为例
Docker文件
FROM python:3-alpine
RUN apk add --update py3-numpy
我构建我的 Docker 图像
$ docker build -t python-numpy .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM python:3-alpine
---> 930a7e894675
Step 2/2 : RUN apk add --update py3-numpy
---> Running in b30470090cde
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/6) Installing libgcc (8.3.0-r0)
(2/6) Installing libquadmath (8.3.0-r0)
(3/6) Installing libgfortran (8.3.0-r0)
(4/6) Installing openblas (0.3.6-r0)
(5/6) Installing python3 (3.7.3-r0)
(6/6) Installing py3-numpy (1.16.4-r1)
Executing busybox-1.30.1-r2.trigger
OK: 113 MiB in 41 packages
Removing intermediate container b30470090cde
---> 5a82ffa67522
Successfully built 5a82ffa67522
Successfully tagged python-numpy:latest
运行 它并尝试在 python
中导入包
$ docker run -it --rm python-numpy python -c "import numpy"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
但是,没有找到。 运行pip install numpy
apk add --update py3-numpy
后不考虑apk包py3-numpy
下载另一个版本:
Collecting numpy
Downloading https://files.pythonhosted.org/packages/da/32/1b8f2bb5fb50e4db68543eb85ce37b9fa6660cd05b58bddfafafa7ed62da/numpy-1.17.0.zip (6.5MB)
...
如果我在 pip install numpy==1.16.4-r1
中指定与 py3-numpy
相同的版本(参见 docker build
的输出),它会导致
Collecting numpy==1.16.4-r1
ERROR: Could not find a version that satisfies the requirement numpy==1.16.4-r1 (from versions: 1.3.0, 1.4.1, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.2, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2, 1.9.3, 1.10.0.post2, 1.10.1, 1.10.2, 1.10.4, 1.11.0b3, 1.11.0rc1, 1.11.0rc2, 1.11.0, 1.11.1rc1, 1.11.1, 1.11.2rc1, 1.11.2, 1.11.3, 1.12.0b1, 1.12.0rc1, 1.12.0rc2, 1.12.0, 1.12.1rc1, 1.12.1, 1.13.0rc1, 1.13.0rc2, 1.13.0, 1.13.1, 1.13.3, 1.14.0rc1, 1.14.0, 1.14.1, 1.14.2, 1.14.3, 1.14.4, 1.14.5, 1.14.6, 1.15.0rc1, 1.15.0rc2, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0rc1, 1.16.0rc2, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.16.4, 1.17.0rc1, 1.17.0rc2, 1.17.0)
ERROR: No matching distribution found for numpy==1.16.4-r1
我错过了什么?
将其安装为 python 包可以正常工作,因为基本映像是 python,因此我建议您将其安装为 python 包。由于使用 alpine 包管理器安装,它不存在于 python 包中,也不存在于 alpine 包中。所以下面可以正常工作。
FROM python:3-alpine
RUN apk add g++ && \
pip install numpy
现在运行容器
docker run -it --rm abc python -c "import numpy"
编辑: 不推荐这种方法,因为 apk 包适用于不同的 python 版本(参见 )。
apk 在 /usr/lib/python3.7/site-packages
中安装 python 个包。此路径不是 Python 的 sys.path
的一部分(在 Docker 图像中)。因此,找不到使用 apk 安装的包。安装目录必须添加到 search path:
FROM python:3.7-alpine
RUN apk add --update py3-numpy
ENV PYTHONPATH /usr/lib/python3.7/site-packages
请注意,没有 /usr/lib/python3/site-packages
,即使您使用 python:3.6-alpine
,apk add --update py3-numpy
也会创建目录 /usr/lib/python3.7
而不是 /usr/lib/python3.6
。
顺便说一句,如果你使用python:3
,你也会遇到类似的问题,但安装目录不同
FROM python:3
RUN apt-get update && apt-get install -y python3-numpy
ENV PYTHONPATH /usr/lib/python3/dist-packages
问题是 python:3-alpine
有两个 Python:一个由 Alpine 提供,另一个由 Python Docker 图像添加。在一个中安装包不会反映在另一个中。
部分选项:
- 切换到仅 alpine 基础映像,
FROM alpine:3.10
。然后,您只需通过 apk 安装 Python。
- 停止使用 Alpine,改用
FROM python:3.7-slim-buster
(我的个人建议:https://pythonspeed.com/articles/base-image-python-docker-images/)。这将允许您 pip install numpy 而无需编译任何东西——二进制轮子不能在 Alpine 上工作,但可以在 (Debian) Buster 图像上工作。
我想使用 apk 在 Alpine Linux 中安装一些 Python 包。下面我以numpy为例
Docker文件
FROM python:3-alpine
RUN apk add --update py3-numpy
我构建我的 Docker 图像
$ docker build -t python-numpy .
Sending build context to Docker daemon 2.048kB
Step 1/2 : FROM python:3-alpine
---> 930a7e894675
Step 2/2 : RUN apk add --update py3-numpy
---> Running in b30470090cde
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/v3.10/community/x86_64/APKINDEX.tar.gz
(1/6) Installing libgcc (8.3.0-r0)
(2/6) Installing libquadmath (8.3.0-r0)
(3/6) Installing libgfortran (8.3.0-r0)
(4/6) Installing openblas (0.3.6-r0)
(5/6) Installing python3 (3.7.3-r0)
(6/6) Installing py3-numpy (1.16.4-r1)
Executing busybox-1.30.1-r2.trigger
OK: 113 MiB in 41 packages
Removing intermediate container b30470090cde
---> 5a82ffa67522
Successfully built 5a82ffa67522
Successfully tagged python-numpy:latest
运行 它并尝试在 python
中导入包$ docker run -it --rm python-numpy python -c "import numpy"
Traceback (most recent call last):
File "<string>", line 1, in <module>
ModuleNotFoundError: No module named 'numpy'
但是,没有找到。 运行pip install numpy
apk add --update py3-numpy
后不考虑apk包py3-numpy
下载另一个版本:
Collecting numpy
Downloading https://files.pythonhosted.org/packages/da/32/1b8f2bb5fb50e4db68543eb85ce37b9fa6660cd05b58bddfafafa7ed62da/numpy-1.17.0.zip (6.5MB)
...
如果我在 pip install numpy==1.16.4-r1
中指定与 py3-numpy
相同的版本(参见 docker build
的输出),它会导致
Collecting numpy==1.16.4-r1
ERROR: Could not find a version that satisfies the requirement numpy==1.16.4-r1 (from versions: 1.3.0, 1.4.1, 1.5.0, 1.5.1, 1.6.0, 1.6.1, 1.6.2, 1.7.0, 1.7.1, 1.7.2, 1.8.0, 1.8.1, 1.8.2, 1.9.0, 1.9.1, 1.9.2, 1.9.3, 1.10.0.post2, 1.10.1, 1.10.2, 1.10.4, 1.11.0b3, 1.11.0rc1, 1.11.0rc2, 1.11.0, 1.11.1rc1, 1.11.1, 1.11.2rc1, 1.11.2, 1.11.3, 1.12.0b1, 1.12.0rc1, 1.12.0rc2, 1.12.0, 1.12.1rc1, 1.12.1, 1.13.0rc1, 1.13.0rc2, 1.13.0, 1.13.1, 1.13.3, 1.14.0rc1, 1.14.0, 1.14.1, 1.14.2, 1.14.3, 1.14.4, 1.14.5, 1.14.6, 1.15.0rc1, 1.15.0rc2, 1.15.0, 1.15.1, 1.15.2, 1.15.3, 1.15.4, 1.16.0rc1, 1.16.0rc2, 1.16.0, 1.16.1, 1.16.2, 1.16.3, 1.16.4, 1.17.0rc1, 1.17.0rc2, 1.17.0)
ERROR: No matching distribution found for numpy==1.16.4-r1
我错过了什么?
将其安装为 python 包可以正常工作,因为基本映像是 python,因此我建议您将其安装为 python 包。由于使用 alpine 包管理器安装,它不存在于 python 包中,也不存在于 alpine 包中。所以下面可以正常工作。
FROM python:3-alpine
RUN apk add g++ && \
pip install numpy
现在运行容器
docker run -it --rm abc python -c "import numpy"
编辑: 不推荐这种方法,因为 apk 包适用于不同的 python 版本(参见
apk 在 /usr/lib/python3.7/site-packages
中安装 python 个包。此路径不是 Python 的 sys.path
的一部分(在 Docker 图像中)。因此,找不到使用 apk 安装的包。安装目录必须添加到 search path:
FROM python:3.7-alpine
RUN apk add --update py3-numpy
ENV PYTHONPATH /usr/lib/python3.7/site-packages
请注意,没有 /usr/lib/python3/site-packages
,即使您使用 python:3.6-alpine
,apk add --update py3-numpy
也会创建目录 /usr/lib/python3.7
而不是 /usr/lib/python3.6
。
顺便说一句,如果你使用python:3
,你也会遇到类似的问题,但安装目录不同
FROM python:3
RUN apt-get update && apt-get install -y python3-numpy
ENV PYTHONPATH /usr/lib/python3/dist-packages
问题是 python:3-alpine
有两个 Python:一个由 Alpine 提供,另一个由 Python Docker 图像添加。在一个中安装包不会反映在另一个中。
部分选项:
- 切换到仅 alpine 基础映像,
FROM alpine:3.10
。然后,您只需通过 apk 安装 Python。 - 停止使用 Alpine,改用
FROM python:3.7-slim-buster
(我的个人建议:https://pythonspeed.com/articles/base-image-python-docker-images/)。这将允许您 pip install numpy 而无需编译任何东西——二进制轮子不能在 Alpine 上工作,但可以在 (Debian) Buster 图像上工作。