docker 在Alpine Linux中使用随apk安装的Python包

slwdgvem  于 2023-01-25  发布在  Docker
关注(0)|答案(3)|浏览(467)

我想用apk在Alpine Linux中安装一些Python包,下面我用numpy作为例子。

    • 停靠文件**
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'

但是没有找到,在apk add --update py3-numpy之后运行pip install 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

我错过了什么?

inb24sb2

inb24sb21#

问题是python:3-alpine有两个Python:一个由Alpine提供,另一个由PythonDocker映像添加,在一个中安装包不会反映在另一个中。
一些选项:
1.切换到alpine基础映像FROM alpine:3.10,然后通过apk安装Python。
1.停止使用Alpine,切换到FROM python:3.7-slim-buster(我个人的建议:https://pythonspeed.com/articles/base-image-python-docker-images/)。这将允许您pip安装numpy而无需编译任何东西-二进制wheels在Alpine上不工作,但可以在(Debian)Buster映像上工作。

jogvjijk

jogvjijk2#

**EDIT:**不推荐使用这种方法,因为apk包适用于不同的python版本(参见Itamar Turner-Trauring's answer)。

apk在/usr/lib/python3.7/site-packages中安装python软件包。这个路径不是Python的sys.path的一部分(在Docker镜像中)。因此,用apk安装的软件包找不到。安装目录必须添加到搜索路径中:

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-alpineapk 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
yc0p9oo0

yc0p9oo03#

安装为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"

相关问题