【问题标题】:How to install pyzmq on an Alpine Linux container?如何在 Alpine Linux 容器上安装 pyzmq?
【发布时间】:2018-08-19 06:38:46
【问题描述】:

我有一个带有python:3.6-alpine 内核的容器。我在通过pip 安装pyzmq 时遇到问题:

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/

[注意]:

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 没有任何问题

【问题讨论】:

    标签: python docker pip alpine pyzmq


    【解决方案1】:

    使用py3-zmq

    根据我的经验,python:3.6-alpine 不适合安装带有 C 扩展名的包,因为缺少 Python 标头。 alpine 图像已经提供了 Python 3.6 发行版和 precompiled pyzmq package,所以它已经足够了:

    FROM alpine:edge
    
    RUN apk update && apk add py3-zmq
    
    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 不兼容许多 linux1,因此任何包含 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,它具有从源代码构建的Python 并位于/usr/local 下。因此,当您从python:3.6-alpine 继承时,安装python3-dev 并运行pip install pyzmq,您最终将使用Python 3.6.4 的头文件为Python 3.6.6(来自python:3.6-alpine)构建pyzmq(来自apk add python3-dev)。一般来说,这应该不是问题(头文件仅在主要 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-zmq
    
    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-zmq
     ---> 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
    

    【讨论】:

    • 这似乎比我的回答更完整。 +1
    • @hoefling 谢谢你的回答,我有一个问题:你的意思是在你的第一部分FROM python:3.6-alpine而不是FROM alpine:edge
    • @BenyaminJafari 这是故意的。请重新查看答案以获得解释。
    • @hoefling alpine:edge 本身没有任何蟒蛇。您建议的 dockerfile 对我不起作用。
    【解决方案2】:

    检查这是否更适用于 python 3.7,如 zeromq/pyzmq issue 1050 中所述

    .c 文件是使用 Cython 生成的。 Python 3.7 似乎更改了其 C API,因此.c 文件不再与 Python 3.7 兼容。我们需要等待 Cython 版本修复对未发布 Python 的支持,然后才能使用它。

    【讨论】:

    • 我试过FROM python:3.7-alpine,但问题是一样的。并且在这句话中提到不要使用python3.7。
    • @BenyaminJafari 什么 Cython 版本安装在您的 pytho 映像中?或者您能否确保在您的容器中安装最新的 Cython?
    • 好的,我检查一下。但是当我与FROM python:3.6 一起使用时,我没有任何问题,但我想要python:alpine
    • @BenyaminJafari 是的,python:alpine 是 3.7 (hub.docker.com/_/python),因此我建议检查 Cython 版本。
    • 如何查看 Cython 版本?我试过pip show Cython,但没有出现任何东西。我尝试使用pip install Cython,但在此安装中出现相同的错误。 . .
    【解决方案3】:

    感谢@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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-06-11
      • 2016-09-27
      • 1970-01-01
      • 2017-04-11
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多