Ben*_*ari 3 pip python-3.x pyzmq docker alpine-linux
我有一个带有python:3.6-alpine
内核的容器,我在用pip安装pyzmq时遇到问题:
FROM python:3.6-alpine
RUN mkdir /code
RUN apk add vim
WORKDIR /
ADD . /code
Run Code Online (Sandbox Code Playgroud)
version: '3'
services:
battery_monitoring:
build: .
image: bm:1.0.0
container_name: battery_monitoring
restart: unless-stopped
volumes:
- .:/code
tty: true
Run Code Online (Sandbox Code Playgroud)
当我在此容器上安装几个Python库时,我没有任何问题,但是在pyzmq库中,出现错误:
$ docker-compose build
$ docker-compose up -d
$ docker exec -it <This-container-ID> sh
Run Code Online (Sandbox Code Playgroud)
pip install pyserial
pip install easydict
Run Code Online (Sandbox Code Playgroud)
上面的命令也安装了,但是在pyzmq安装中,我遇到了以下错误:
pip install pyzmq
Run Code Online (Sandbox Code Playgroud)
结果的一部分:
----------------------------------------
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/
Run Code Online (Sandbox Code Playgroud)
[ 注意 ]:
pip -V
pip 18.0 from /usr/local/lib/python3.6/site-packages/pip (python 3.6)
which pip
/usr/local/bin/pip
Run Code Online (Sandbox Code Playgroud)
我没有任何问题FROM python:3.6-slim
,而不是FROM python:3.6-alpine
py3-zmq
包装根据我的经验,python:3.6-alpine
由于缺少Python标头,因此不太适合安装具有C扩展名的软件包。这些alpine
图像已经提供了Python 3.6发行版以及一个预编译的pyzmq
package,因此已经足够了:
FROM alpine:edge
RUN apk update && apk add py3-zmq
CMD ["/bin/sh"]
Run Code Online (Sandbox Code Playgroud)
校验:
FROM alpine:edge
RUN apk update && apk add py3-zmq
CMD ["/bin/sh"]
Run Code Online (Sandbox Code Playgroud)
这是pyzmq
在Alpine容器中安装的最简单,最可靠的方法。
pip install
Alpine与manylinux1不兼容,因此任何包含C扩展名的软件包都必须从源代码构建。这意味着您必须先安装构建工具。同样,我将使用alpine
image而不是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"]
Run Code Online (Sandbox Code Playgroud)
校验:
$ docker run --rm -it my/alpine /bin/sh
/ # python3 -c "import zmq; print(zmq.__version__)"
17.1.0
Run Code Online (Sandbox Code Playgroud)
python:3.6-alpine
请注意,python:3.6-alpine
它不会通过安装Python apk
,而是从源代码构建Python,并位于Python下/usr/local
。因此,当您从继承python:3.6-alpine
,安装python3-dev
并运行时pip install pyzmq
,最终将使用Python 3.6.4(来自)的头文件pyzmq
来构建Python 3.6.6(python:3.6-alpine
来自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
Run Code Online (Sandbox Code Playgroud)
检查这是否适用于 python 3.7,如Zeromq/pyzmq 问题 1050中所述
这些
.c
文件是使用 Cython 生成的。Python 3.7 似乎更改了其 C API,因此这些.c
文件不再与 Python 3.7 兼容。我们需要等待 Cython 版本修复对未发布的 Python 的支持,然后才能使用它。
归档时间: |
|
查看次数: |
2565 次 |
最近记录: |