如何知道服务容器是否准备好连接?

我经常遇到这个问题在Docker中创build堆栈。 假设我在docker-compose.yml中有一个LAMP堆栈:

db: image: mysql environment: MYSQL_VARIOUS: things web: build: . links: - db ports: - "80" entrypoint: - setup-and-start 

setup-and-start脚本如下所示:

 wait_for_mysql && initialize 

如果Web容器安装了mysql-client,那么我可以很容易地定义wait_for_mysql

 wait_for_mysql() { local timeout=10 while sleep 1; do mysql [credentials] -e 'select 1;' && return 0 (( --timeout <= 0 )) && break done echo 'Failed to initialize mysql within time limit.' >&2 return 1 } 

但是许多容器不会有客户端。 而不是将其安装到每个轻量级容器中,是否有一种合理的方法可以在初始化我的应用程序之前检查mysql是否已启动并运行? 它应该在大多数Docker容器上工作,但不一定是mysql的完美validation; 即使检查预期的telnet响应也可能是可以接受的(除了telnet在Docker镜像上也不常见)。

这个问题在Docker Compose FAQ中有介绍 。 简短的回答没有什么好的方法,这是通过devise。 虽然这个用例在testing中非常常见,而且任何重要系统的小应用程序wait for startup都是反模式。

等待数据库准备就绪的问题实际上只是分布式系统的一个更大的问题的一个子集。 在生产中,您的数据库可能随时变为不可用或移动主机。 应用程序需要适应这些types的故障。