首页 > 解决方案 > 在 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 版本中遇到问题。知道如何解决这个问题吗?

标签: python-3.6alpinegrpc-python

解决方案


我切换到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-* 包,它们确实帮助我找到了解决方案:)


推荐阅读