如何在Alpine Linux容器上安装pyzmq?

7

我是一位有用的助手,可以为您提供文本翻译。

我有一个使用 python:3.6-alpine 内核的容器。我在安装pyzmq时遇到了问题,使用pip安装。

Dockerfile:

FROM python:3.6-alpine

RUN mkdir /code
RUN apk add vim
WORKDIR /
ADD . /code

docker-compose.yml:

version: '3'

services:
  battery_monitoring:
      build: .
      image: bm:1.0.0
      container_name: battery_monitoring
      restart: unless-stopped
      volumes:
        - .:/code
      tty: true

我在容器上安装多个Python库时没有任何问题,但是在安装pyzmq库时会出现错误:

步骤:

$ docker-compose build
$ docker-compose up -d
$ docker exec -it <This-container-ID> sh

在容器中:

pip install pyserial
pip install easydict

上述软件包已正确安装,但pyzmq安装出现以下错误:
pip install pyzmq

结果的一部分:

    ----------------------------------------
Command "/usr/local/bin/python -u -c "import setuptools, tokenize;__file__='/tmp/pip-install-545my4q5/pyzmq/setup.py';f=getattr(tokenize, 'open', open)(__file__);code=f.read().replace('\r\n', '\n');f.close();exec(compile(code, __file__, 'exec'))" install --record /tmp/pip-record-nbtsgz0b/install-record.txt --single-version-externally-managed --compile" failed with error code 1 in /tmp/pip-install-545my4q5/pyzmq/

[NOTE]:

pip -V
pip 18.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)

which pip
/usr/local/bin/pip
  • 使用python:3.6-slim代替python:3.6-alpine没有任何问题。
3个回答

20

使用py3-zmq包(在2022年8月之前更名为py3-pyzmq

从我的经验来看,python:3.6-alpine不适合安装带有C扩展的软件包,因为缺少Python头文件。 alpine镜像已经提供了Python 3.6分发版以及预编译的pyzmq,所以只需执行以下操作即可:

FROM alpine:edge

RUN apk update && apk add py3-pyzmq

CMD ["/bin/sh"]

检查:

$ docker run --rm -it my/alpine /bin/sh
/ # python3 -c "import zmq; print(zmq.__version__)"
17.1.0

这是在Alpine容器中安装pyzmq的最简单和最可靠的方法。

使用pip install从源代码构建

Alpine不兼容manylinux1,因此任何包含C扩展的软件包都必须从源代码构建。这意味着您必须先安装构建工具。同样,我会使用alpine镜像而不是python:3.6-alpine

FROM alpine:edge

RUN apk update && apk add build-base libzmq musl-dev python3 python3-dev zeromq-dev

RUN pip3 install pyzmq

# reduce image size by cleaning up the build packages
RUN apk del build-base musl-dev python3-dev zeromq-dev

CMD ["/bin/sh"]

检查:

$ docker run --rm -it my/alpine /bin/sh
/ # python3 -c "import zmq; print(zmq.__version__)"
17.1.0

如果你坚持使用 python:3.6-alpine

请注意,python:3.6-alpine 并没有通过 apk 安装 Python,而是从源代码构建,并位于 /usr/local 目录下。因此,当你继承自 python:3.6-alpine,安装 python3-dev 并运行 pip install pyzmq 时,你将会使用来自 Python 3.6.4(来自 apk add python3-dev)的头文件来构建 Python 3.6.6(来自 python:3.6-alpine)的 pyzmq。一般来说,这不应该成为问题(头文件仅在主要 Python 版本之间不兼容),但是如果头文件被发行版维护人员进行了修改,则可能会成为问题。

编辑:具体复现步骤和日志

$ docker image rm my/alpine:latest
Untagged: my/alpine:latest
Deleted: sha256:2e613cdc3c90c9d44b23d399bd44069217e5b31c1b4a8fc91e501c5226a4ef6a
Deleted: sha256:d66ac6c96a4fca9c4fe71a73b64a4dd3605a59e570f327974954649b633a7fc5
Deleted: sha256:114efba5527eb4ab23020ef84b6181b6a6ba790059b83ce046c9a1a6c0bdf419

$ docker image prune
WARNING! This will remove all dangling images.
Are you sure you want to continue? [y/N] y
Deleted Images:
untagged: alpine@sha256:79c2c5f6db53da44f90bb2731f29f725b5b14c378407a123776b6d3c76e6aebe
untagged: alpine@sha256:ae8a1f9146d74466ddf1def02088ba33544db9aceef01f4b388c674a5ad1d00b
deleted: sha256:5c4fa780951b060bb0a75355765bc58112350d9974970d60561671d552aaf2e2
deleted: sha256:c9e8b5c053a2dda62373bc57fa8cb634230a92ba5f02d2baf5d35b932d04a878

Total reclaimed space: 4.148MB

$ cat ./Dockerfile
FROM alpine:edge

RUN apk update && apk add py3-pyzmq

CMD ["/bin/sh"]

$ docker pull alpine:edge
edge: Pulling from library/alpine
a0710691c81a: Pull complete
Digest: sha256:8d9872bf7dc946db1b3cd2bf70752f59085ec3c5035ca1d820d30f1d1267d65d
Status: Downloaded newer image for alpine:edge

$ docker build -t my/alpine .
Sending build context to Docker daemon  3.072kB
Step 1/3 : FROM alpine:edge
 ---> 9d1f27787d39
Step 2/3 : RUN apk update && apk add py3-pyzmq
 ---> Running in 0f9bd971b5da
fetch http://dl-cdn.alpinelinux.org/alpine/edge/main/x86_64/APKINDEX.tar.gz
fetch http://dl-cdn.alpinelinux.org/alpine/edge/community/x86_64/APKINDEX.tar.gz
v3.8.0-1447-g6c9915aaa5 [http://dl-cdn.alpinelinux.org/alpine/edge/main]
v3.8.0-1459-g2ff55fde23 [http://dl-cdn.alpinelinux.org/alpine/edge/community]
OK: 9626 distinct packages available
(1/16) Installing libbz2 (1.0.6-r6)
(2/16) Installing expat (2.2.5-r0)
(3/16) Installing libffi (3.2.1-r4)
(4/16) Installing gdbm (1.13-r1)
(5/16) Installing xz-libs (5.2.4-r0)
(6/16) Installing ncurses-terminfo-base (6.1-r0)
(7/16) Installing ncurses-terminfo (6.1-r0)
(8/16) Installing ncurses-libs (6.1-r0)
(9/16) Installing readline (7.0.003-r0)
(10/16) Installing sqlite-libs (3.24.0-r1)
(11/16) Installing python3 (3.6.4-r1)
(12/16) Installing libgcc (6.4.0-r8)
(13/16) Installing libsodium (1.0.16-r0)
(14/16) Installing libstdc++ (6.4.0-r8)
(15/16) Installing libzmq (4.2.3-r0)
(16/16) Installing py3-zmq (17.1.0-r0)
Executing busybox-1.28.4-r0.trigger
OK: 69 MiB in 29 packages
Removing intermediate container 0f9bd971b5da
 ---> 83a4db72581d
Step 3/3 : CMD ["/bin/sh"]
 ---> Running in b37e3ef8e639
Removing intermediate container b37e3ef8e639
 ---> 558bd6427c77
Successfully built 558bd6427c77
Successfully tagged my/alpine:latest

$ docker run --rm -it my/alpine python3 -c "import zmq; print(zmq.__version__)"
17.1.0

有点相关:在Unix & Linux上的关于在Alpine上安装cryptography的问题 - hoefling
@BenyaminJafari,您使用了哪个Dockerfile?出现了什么错误? - hoefling
@BenyaminJafari 这个错误意味着Python已经成功安装。运行生成的容器并执行三个命令:which -a python3which -a pip3pip3 list,输出是什么? - hoefling
你,先生,是真正的MVP。 - Sam
1
@Efren 由于某些原因,它被重命名为py3-pyzmq。:shrug: - hoefling
显示剩余8条评论

0

检查一下是否与Python 3.7更好地配合使用,如zeromq/pyzmq issue 1050中所述。

.c文件是由Cython生成的。看起来Python 3.7已经改变了其C API,因此这些.c文件不再与Python 3.7兼容。我们需要等待一个修复未发布Python支持的Cython版本才能使用它。


我尝试使用 FROM python:3.7-alpine,但问题仍然存在。并且在这个引用中提到不要使用 from python3.7。 - Benyamin Jafari
@BenyaminJafari 你的Python镜像中安装了哪个Cython版本?或者你能确保在你的容器中安装最新的Cython吗? - VonC
好的,我会检查一下。但是当我使用 FROM python:3.6 时,我没有任何问题,但我想要使用 python:alpine - Benyamin Jafari
1
@BenyaminJafari 是的,python:alpine是3.7版本(https://hub.docker.com/_/python/),因此我建议检查Cython版本。 - VonC
我该如何检查Cython版本?我尝试使用pip show Cython,但没有任何内容显示。我还尝试了pip install Cython,但在此安装中出现了相同的错误... - Benyamin Jafari
显示剩余2条评论

0

感谢 @hoefling,我在 Alpine Linux v3.12 上首先安装了 py3-pyzmq 包,解决了这个依赖问题。

  1. 运行 Alpine 3.12 的 Docker 容器。

    [ chusiang@macOS-11.0.1 ~ ]
    $ docker run -it --rm alpine:3 sh
    
  2. 安装 py3-pyzmq apk 包。

    /home # apk add py3-pyzmq
    (1/3) Installing libsodium (1.0.18-r0)
    (2/3) Installing libzmq (4.3.3-r0)
    (3/3) Installing py3-pyzmq (18.1.1-r0)
    OK: 385 MiB in 97 packages
    
  3. 安装 jupyter 笔记本的 pip3 包。

    /home # pip3 install jupyter
    
  4. 完成!

    /home #  jupyter --version
    jupyter core     : 4.7.0
    jupyter-notebook : 6.1.5
    qtconsole        : 5.0.1
    ipython          : 7.19.0
    ipykernel        : 5.4.1
    jupyter client   : 6.1.7
    jupyter lab      : not installed
    nbconvert        : 6.0.7
    ipywidgets       : 7.5.1
    nbformat         : 5.0.8
    traitlets        : 5.0.5
    
顺便说一下,我参考了这篇文章来升级我的“ansible-jupyter”docker镜像项目中的Python 2 -> 3。

https://github.com/chusiang/ansible-jupyter.dockerfile/commit/200c9a48232b0149adb85fa9e5fc025730691599


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接