如何知道我的程序是否在我的Docker中完全启动

在我的CI链中,我执行了一个“docker-compose up”之后的端到端testing。 不幸的是我的testing经常失败,因为即使容器正确启动,我的容器中包含的程序不是。

有没有一个优雅的方式来validation我的设置是完全开始之前运行我的testing?

在运行testing之前,您可以轮询所需的服务以确认他们正在响应。

curl具有内置的重试逻辑,或者围绕其他types的服务testing构build重试逻辑是相当简单的。

 #!/bin/bash await(){ local url=${1} local seconds=${2:-30} curl --max-time 5 --retry 60 --retry-delay 1 \ --retry-max-time ${seconds} "${url}" \ || exit 1 } docker-compose up -d await http://container_ms1:3000 await http://container_ms2:3000 run-ze-tests 

轮询的替代scheme是基于事件的系统。 如果您的所有服务都将通知推送到外部服务, scaeda提供了一个日志文件的示例,或者您可以使用诸如Amazon SNS之类的东西。 您的服务发出“已启动”事件。 然后,您可以订阅这些事件,并在一切开始后运行您所需要的任何内容。

Docker 1.12添加了HEALTHCHECK构build命令。 也许这是可以通过Docker Events ?

如果您可以在configuration项设置中控制docker引擎,则可以执行docker logs [Container_Name]并读出应用程序可能发出的最后一行。

RESULT=$(docker logs [Container_Name] 2>&1 | grep [Search_String])

日志输出示例:
Agent pid 13
Enter passphrase (empty for no passphrase): Enter same passphrase again: Identity added: id_rsa (id_rsa)
#host SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6
#host SSH-2.0-OpenSSH_6.6.1p1 Ubuntu-2ubuntu2.6

parsing特定行:
RESULT=$(docker logs ssh_jenkins_test 2>&1 | grep Enter)

结果:
Enter passphrase (empty for no passphrase): Enter same passphrase again: Identity added: id_rsa (id_rsa)