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

时间:2015-12-08 16:31:16

标签: service docker docker-compose

我经常遇到这个问题,在Docker中创建堆栈。假设我在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的完美验证;甚至可以接受检查预期的telnet响应(除了telnet在docker镜像上也不常见)。

1 个答案:

答案 0 :(得分:2)

问题包含在Docker Compose FAQ中。简短的回答没有好办法,这是设计的。虽然这个用例在测试中很常见,但任何重要系统的小应用程序{{1}}都是反模式。

  

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