如何等待 docker 容器启动并运行?

新手上路,请多包涵

在容器内运行服务时,比如说 mongodb,命令

docker run -d myimage

将立即退出,并返回容器 ID。在我的 CI 脚本中,我在运行 mongo 容器之后立即运行一个客户端来测试 mongodb 连接。问题是:客户端无法连接,因为服务还没有启动。除了在我的脚本中添加一个大的 sleep 10 之外,我看不到任何等待容器启动并运行的选项。

Docker 有一个命令 wait 在这种情况下不起作用,因为容器不存在。这是docker的限制吗?

原文由 Gravis 发布,翻译遵循 CC BY-SA 4.0 许可协议

阅读 1k
2 个回答

正如在 docker 1.12 的 类似问题 中所评论的那样

HEALTHCHECK 支持根据 docker /docker#23218 在上游合并 - 可以考虑在启动下一个容器之前确定容器何时健康

这从 docker 1.12rc3 (2016-07-14) 开始可用

docker-compose 正在 支持等待特定条件的功能。

它使用 libcompose (所以我不必重建 docker 交互)并为此添加了一堆配置命令。在这里查看: https ://github.com/dansteen/controlled-compose

你可以像这样在 Dockerfile 中使用它:

 HEALTHCHECK --interval=5m --timeout=3s \
  CMD curl -f http://localhost/ || exit 1

官方文档: https ://docs.docker.com/engine/reference/builder/#/healthcheck

原文由 VonC 发布,翻译遵循 CC BY-SA 3.0 许可协议

找到了这个简单的解决方案,一直在寻找更好的东西,但没有运气……

 until [ "`docker inspect -f {{.State.Running}} CONTAINERNAME`"=="true" ]; do
    sleep 0.1;
done;

或者如果您想等到容器报告为健康状态(假设您进行了健康检查)

 until [ "`docker inspect -f {{.State.Health.Status}} CONTAINERNAME`"=="healthy" ]; do
    sleep 0.1;
done;

原文由 superhero 发布,翻译遵循 CC BY-SA 4.0 许可协议

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题