python-3.6 - 在 python3.6-alpine arm 中找不到 grpc __strdup()
问题描述
当使用需要 grpc 的谷歌库时,我们遇到了这个错误。
环境是 docker arm python3.6-alpine ...
grpcio>=1.33.2
google-cloud-pubsub>=2.1.0
google-api-python-client>=1.12.5
google-auth>=1.23.0
在我们的 dockerfile 中,我们正在安装
WORKDIR /tmp
RUN set -ex \
&& apk add --no-cache --virtual .build-deps \
cmake \
curl \
g++ \
gcc \
jpeg-dev \
libffi-dev \
libjpeg \
make \
musl-dev \
postgresql-dev \
python3-dev \
tzdata \
zlib \
zlib-dev
... later on
RUN pip3 install -r requirements.txt
我什至添加了 libc6-compat 并尝试了。我还添加了 alpines build-base 和 alpine-sdk 以尝试覆盖所有基础。
Traceback (most recent call last):
File "/usr/local/lib/python3.6/runpy.py", line 193, in _run_module_as_main
"__main__", mod_spec)
File "/usr/local/lib/python3.6/runpy.py", line 85, in _run_code
exec(code, run_globals)
File "/usr/local/lib/python3.6/site-packages/...", line 48, in <module>
from ... import...
File "/usr/local/lib/python3.6/site-packages/...", line 13, in <module>
from google.cloud import pubsub_v1
File "/usr/local/lib/python3.6/site-packages/google/cloud/pubsub_v1/__init__.py", line 17, in <module>
from google.cloud.pubsub_v1 import types
File "/usr/local/lib/python3.6/site-packages/google/cloud/pubsub_v1/types.py", line 36, in <module>
from google.pubsub_v1.types import pubsub as pubsub_gapic_types
File "/usr/local/lib/python3.6/site-packages/google/pubsub_v1/__init__.py", line 18, in <module>
from .services.publisher import PublisherClient
File "/usr/local/lib/python3.6/site-packages/google/pubsub_v1/services/publisher/__init__.py", line 18, in <module>
from .client import PublisherClient
File "/usr/local/lib/python3.6/site-packages/google/pubsub_v1/services/publisher/client.py", line 27, in <module>
from google.api_core import gapic_v1 # type: ignore
File "/usr/local/lib/python3.6/site-packages/google/api_core/gapic_v1/__init__.py", line 18, in <module>
from google.api_core.gapic_v1 import config
File "/usr/local/lib/python3.6/site-packages/google/api_core/gapic_v1/config.py", line 23, in <module>
import grpc
File "/usr/local/lib/python3.6/site-packages/grpc/__init__.py", line 23, in <module>
from grpc._cython import cygrpc as _cygrpc
ImportError: Error relocating /usr/local/lib/python3.6/site-packages/grpc/_cython/cygrpc.cpython-36m-arm-linux-gnueabihf.so: __strdup: symbol not found
这在 x64 alpine 中运行良好。到目前为止,我们只在 arm 版本中遇到问题。知道如何解决这个问题吗?
解决方案
我切换到FROM --platform=linux/arm/v7 python:3.8-alpine
并添加了一些部门
RUN set -ex \
&& apk add --no-cache --virtual .build-deps \
cmake \
curl \
g++ \
gcc \
jpeg-dev \
libffi-dev \
libjpeg \
make \
musl-dev \
musl \
postgresql-dev \
python3-dev \
tzdata \
zlib \
zlib-dev \
libc6-compat \
libc-dev \
alpine-sdk \
build-base \
linux-headers \
cython \
c-ares-dev \
gdbm \
libffi
现在它起作用了。
似乎随着 ARM 变得更加主流,将会有更好的支持等等。现在我们多次在 x86_64 上构建没有问题,但 ARM 构建有很多问题(主要是谷歌库)。
我仍然不知道是什么导致了原来的问题。我只是偶然解决了这个问题。我一直在尝试不同的东西。
我发现 alpine 有 py3-grpcio 和 py3-google-api-core 以及其他作为 apk 可用的。所以我添加了这些。在检查包时我看到它是 v1.17.0
py3-google-api-core: Fetching https://distfiles.alpinelinux.org/distfiles/google-api-core-1.17.0.tar.gz
如果您查看 python pubsub 的 google 源代码,您可以在版本 <= 1.4.2 中看到(我认为):
dependencies = [
# google-api-core[grpc] 1.17.0 causes problems, thus restricting its
# version until the issue gets fixed.
# https://github.com/googleapis/python-pubsub/issues/74
"google-api-core[grpc] >= 1.14.0, < 1.17.0",
"grpc-google-iam-v1 >= 0.12.3, < 0.13dev",
'enum34; python_version < "3.4"',
]
注意第一条评论。“当然”,我想。为什么它会是工作版本。但是在 alpine 包源中,我注意到它使用的是 python3.8,所以这就是我将 dockerfile 从 python3.6 切换到 python3.8 的原因。所以我想最终即使我最终没有使用 alpine py3-* 包,它们确实帮助我找到了解决方案:)
推荐阅读
- mysql - 日期范围查询的聚集索引与非聚集索引
- android - 高级用户可以在android应用程序上读取内存存储的变量吗
- c++ - opencv 3.4 imshow() 打开与已使用 namedWindow 打开的名称相同的第二个窗口
- linux - 没有文件系统的 Linux 设备
- angularjs - 在 groovy 应用程序中接收 Json 数据
- android - 带有复选框的可编辑列表
- python - 尝试更新 libpython3.6-stdlib 会导致覆盖错误
- dji-sdk - 访问电机功率级别
- reactjs - 防止 React 组件中的默认问题
- javascript - 更改文件不起作用?