等待分离容器 运行

Wait for detached container to be running

我正在使用 docker-py to help write some quite complex BDD tests via behave

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

但是,我无法理解如何让我的代码等待 Docker 容器准备好接受 data/commands。目前,我有一个丑陋的 sleep(60) ,这显然是 错误的做法

如何等待容器准备好?

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

然而,如果没有这样的东西,除了 sleep,你不能做太多,因为(从 Docker 的角度来看)容器可以在其内部的主进程之前准备好准备就绪(同样,数据库容器可以在其中的数据库进程准备好接受连接之前完全启动,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.