我正在使用docker-py通过behave帮助编写一些非常复杂的BDD测试。
我将containers.run
与detach=True
一起使用,因为我需要能够继续执行我的脚本。 Given
步骤创建一个容器,然后when
步骤使用该容器在其中进行某些操作,最后,按预期,then
步骤断言正确的事情已经完成。
但是,我无法理解如何让我的代码等待Docker容器准备好接受数据/命令。目前,我在其中有一个难看的sleep(60)
,这显然是错误的方法。
我如何等待容器准备好?
最佳答案
如果您正在等待的容器运行的服务可以清楚地将其状态传达给外界(例如,一个拒绝或接受连接的数据库),那么您可以轻松地在测试中构建一些try-catch功能来检查是否测试开始之前容器已准备就绪。
但是,如果没有这样的事情,那么除了sleep
之外,您就无法做其他事情,因为(从Docker的 Angular 来看)容器可以在其内部的主进程就绪之前就已经就绪(同样,数据库容器可以在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
。
关于python-3.x - 等待分离的容器运行,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/56336878/