Docker + pubsub + subprocess 挂起且没有错误

Posted

技术标签:

【中文标题】Docker + pubsub + subprocess 挂起且没有错误【英文标题】:Docker + pubsub + subprocess hangs with no errors 【发布时间】:2020-09-24 07:08:27 【问题描述】:

我在 docker 容器中运行 pubsub,几分钟后遇到挂起。我一直在 docker 之外使用类似的命令运行 pubsub,并且没有看到挂起(运行超过 1 年)。

我能够通过下面概述的简化实现重现我的问题。

以下四个文件(docker file、requirements.txt、worker.py、test.py)放在同一个目录下。它们位于此要点中。基本上 worker.py 调用的是一个子进程函数,它调用 test.py 来运行 time.sleep(3)。

Gist for code and debug outputs

为了构建 docker 文件,我将 Dockerfile、requirements.txt、worker.py 和 test.py 放入一个目录并运行:

docker build --tag=test .

要运行 docker 文件,我执行了以下操作:

docker run -it \
   -e GOOGLE_APPLICATION_CREDENTIALS=/keys/service-account.json \
   -e GRPC_ENABLE_FORK_SUPPORT=false \
   -e GRPC_VERBOSITY=debug \
   -e GRPC_TRACE=all \
   -v /tmp/keys/:/keys/:ro \
   -v /tmp/logs:/logs \
test:latest bash

文件 service-account.json 包含我的 pubsub 密钥。

我在我的 Mac 上运行 docker,但我也经历过使用 kubernetes 和运行 docker 的 Ubuntu 18.04 机器上的相同挂起。问题是几分钟后,pubsub 订阅者变得无响应。以上代码在没有docker的虚拟环境中完美运行。

文件(要点)publish_output.txt 是我的 pubsub 发布者输出的日志文件,并包含消息 ID。

文件subscriber_output.txt(要点)是订阅者日志输出。我将 GRPC_TRACE 设置为 all 并将 GRPC_VERBOSITY 设置为调试。 收到的最后一条成功消息是消息 ID 1253690400552289(subscriber_output.txt 的第 9338 行)。 pubsub 未收到 1253713007710668、1253714609061509、1253713464329969 及以后的消息。

我需要做任何额外的设置吗?不幸的是,我正在从 python 运行自定义 C++ 代码,所以我需要使用子进程。

我的 docker 配置中的当前 python 包:

CacheControl             0.12.6
cachetools               4.1.0
certifi                  2020.4.5.1
chardet                  3.0.4
firebase                 3.0.1
firebase-admin           4.3.0
firestore                0.0.8
google-api-core          1.18.0
google-api-python-client 1.9.1
google-auth              1.16.1
google-auth-httplib2     0.0.3
google-cloud-core        1.3.0
google-cloud-firestore   1.7.0
google-cloud-logging     1.15.0
google-cloud-pubsub      1.5.0
google-cloud-storage     1.28.1
google-resumable-media   0.5.1
googleapis-common-protos 1.52.0
grpc-google-iam-v1       0.12.3
grpcio                   1.29.0
httplib2                 0.18.1
idna                     2.9
iso8601                  0.1.12
msgpack                  1.0.0
pip                      20.1.1
protobuf                 3.12.2
pyasn1                   0.4.8
pyasn1-modules           0.2.8
pytz                     2020.1
requests                 2.23.0
rsa                      4.0
setuptools               46.4.0
six                      1.15.0
uritemplate              3.0.1
urllib3                  1.25.9
wheel                    0.34.2

感谢任何帮助。

谢谢!

【问题讨论】:

【参考方案1】:

看起来问题出在 google-core-api 上。

我可以按照这里的建议解决它:

https://github.com/googleapis/python-pubsub/issues/112

基本上 requirements.txt 应该使用这些版本:

google-api-python-client <= 1.8.4
google-api-core <= 1.16.0

【讨论】:

以上是关于Docker + pubsub + subprocess 挂起且没有错误的主要内容,如果未能解决你的问题,请参考以下文章

无法让谷歌身份验证在 docker 内工作以发布到 pubsub

pip install google-cloud-pubsub 在 docker 容器中安装失败

“处理组件 pubsub 错误:组件 pubsub 的初始化超时超过 5 秒”

执行外部命令subproces.run,subproces.Popen()

如何更新在 Amazon ECS 上运行的 docker 容器

google.cloud.pubsub_v1 和 google.cloud.pubsub 有啥区别?