等待分离的容器运行

时间:2019-05-28 07:17:06

标签: python-3.x docker python-behave dockerpy

我正在使用docker-py通过behave帮助编写一些非常复杂的BDD测试。

我将containers.rundetach=True一起使用,因为我需要能够继续执行我的脚本。 Given步骤创建了一个容器,然后when步骤使用该容器在其中进行某些操作,最后,正如预期的那样,then步骤断言正确的事情已经完成。

但是,我无法理解如何让我的代码等待Docker容器准备好接受数据/命令。目前,我在其中有一个丑陋的sleep(60),显然这是错误的处理方式

如何等待容器准备就绪?

1 个答案:

答案 0 :(得分:2)

如果您正在等待的容器运行的服务可以将其状态清楚地传达给外界(例如,一个拒绝或接受连接的数据库),那么您可以轻松地在测试中构建一些try-catch功能来在测试开始之前检查容器是否已准备就绪。

但是,如果没有这样的事情,除了sleep之外,您将无能为力,因为(从Docker的角度来看)容器可以在其内部的主进程准备好之前准备好(同样是数据库)容器可以在其中的DB进程准备好接受连接之前完全启动,而Docker对此无能为力。

一种骇人听闻的方法是为您正在等待的容器定义一个新的ENTRYPOINT,将一个文件放置在测试可以查找的位置。如果文件存在,则可以开始测试,否则可以sleep(1)并再次查看。 entrypoint.sh的示例(未经测试):

#!/bin/sh

set -e

# run the process you need here

touch /tmp/i-am-ready

exec "$@"

然后您的测试可以直接在容器中检查此文件,也可以将其作为卷安装在某个位置。您还必须确保touch之后还有一个附加的进程,否则您的容器可能会exit 0