我正在使用docker-py通过behave帮助编写一些非常复杂的BDD测试。
我将containers.run
与detach=True
一起使用,因为我需要能够继续执行我的脚本。 Given
步骤创建了一个容器,然后when
步骤使用该容器在其中进行某些操作,最后,正如预期的那样,then
步骤断言正确的事情已经完成。>
但是,我无法理解如何让我的代码等待Docker容器准备好接受数据/命令。目前,我在其中有一个丑陋的sleep(60)
,显然这是错误的处理方式。
如何等待容器准备就绪?
答案 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
。