并行运行多个 docker 容器时出现网络错误

并行运行多个 docker 容器时出现网络错误

我的目录中有许多包含单元测试的 python 文件,/code/test为了在不进行任何代码编辑的情况下并行化我的测试运行,我想我可以使用 GNU Parallel针对数据库N一次运行文件。N首先我启动数据库:

$ docker run -d --name redis-unittest-1 redis \
 && docker run -d --name mongo-unittest-1 mongo:3.2.10 \
 && docker run -d --name redis-unittest-2 redis \
 && docker run -d --name mongo-unittest-2 mongo:3.2.10 \
 && docker run -d --name redis-unittest-3 redis \
 && docker run -d --name mongo-unittest-3 mongo:3.2.10 \
 && docker run -d --name redis-unittest-4 redis \
 && docker run -d --name mongo-unittest-4 mongo:3.2.10 \
 && docker run -d --name redis-unittest-5 redis \
 && docker run -d --name mongo-unittest-5 mongo:3.2.10 \
 && docker run -d --name redis-unittest-6 redis \
 && docker run -d --name mongo-unittest-6 mongo:3.2.10 \
 && docker run -d --name redis-unittest-7 redis \
 && docker run -d --name mongo-unittest-7 mongo:3.2.10 \
 && docker run -d --name redis-unittest-8 redis \
 && docker run -d --name mongo-unittest-8 mongo:3.2.10

然后使用find获取所有测试文件名,并将其通过管道传输到 Parallel 中。

docker run test_img find /code/test -name "test*.py" \
| parallel -j8 \
docker run --rm \
--link mongo-unittest-{%}:db --link redis-unittest-{%}:redis \
-v $(pwd)/test-reports:/code/test-reports \
test_img python /code/test/discover.py --file {}  

这一切似乎都很顺利,但是有时其中一个文件将失败,如下所示:

Traceback (most recent call last):
  File "/code/test/server/testApplicationAPI.py", line 28, in setUp
    super(TestApplicationAPI, self).setUp()
  File "/code/test/server/tools/testutils.py", line 345, in setUp
    self.app = server.createApp(True)
  File "/code/server/util/rq/../../server.py", line 55, in createApp
    mongo = PyMongo(app)
  File "/usr/local/lib/python2.7/site-packages/flask_pymongo/__init__.py", line 97, in __init__
    self.init_app(app, config_prefix)
  File "/usr/local/lib/python2.7/site-packages/flask_pymongo/__init__.py", line 249, in init_app
    cx = connection_cls(*args, **kwargs)
  File "/usr/local/lib/python2.7/site-packages/pymongo/mongo_client.py", line 428, in __init__
    raise ConnectionFailure(str(e))
ConnectionFailure: [Errno -2] Name or service not known

我不知道如何开始解决这个问题。也许像 strace 这样的东西可以更详细地了解发生了什么?但我从来没有真正使用过它。任何想法将不胜感激。

答案1

您似乎在 MongoDB 中发现了竞争条件错误。从消息来看,似乎 DNS 过载,但很可能是其他原因。

你现在应该:

  • 看看是否可以在 MongoDB 的最新代码中重现该错误(该错误可能是众所周知的并且已经修复)。
  • 看看你是否可以制作 MCVEhttps://stackoverflow.com/help/mcve。当错误是竞争条件时,这通常非常困难 - 特别是因为您希望开发人员能够重现您的确切情况。如果您可以从 OsBoxes.org 引发虚拟机上的错误,那么这是一个好的开始。改变并行作业的数量和虚拟机上的核心数量也会有所帮助。也许 Mongo 社区中的一些乐于助人的人可以指导您?
  • 提交错误报告。

到目前为止,没有任何迹象表明 GNU Parallel 存在问题。

相关内容