Docker:推迟依赖另一个容器的启动操作?

我有两种types的Docker容器:一种使用Web应用程序(nginx / php-fpm),另一种使用MySQL数据库。 两者都通过networking连接。 应用程序容器知道数据库容器,但是,数据库不知道零个或一个或多个应用程序容器是否可用。 这两种容器都使用Supervisord。

数据库容器必须启动mysqld ,这可能需要几秒钟的时间。 另一个容器必须执行一些启动操作,其中一部分需要数据库访问。 由于这些操作依赖于数据库容器,因此我在脚本的顶部放置了一个循环,等待数据库服务器可用:

 try=0 ok=0 until mysql -h$dbhost -u$dbuser -p$dbpass -e "USE $dbname" && ok=1; do [ $((++try)) -gt 30 ] && break sleep 1 done if [ $ok -gt 0 ]; then # DO STUFF else exit 1 fi 

虽然这确实起作用,但是我发现有两个缺点:首先,如果数据库容器停机或者在启动应用程序容器时启动某个超时,则脚本将失败。 其次,应用程序容器将不知道数据库服务器上是否有更改(例如,迁移)。

当我知道Supervisord事件时 ,我想知道:如何在同一个networking中通知任意数量的其他容器?

(注意:我没有限制使用Supervisord,我只是觉得这是最有希望的方法。)

您可能想要使用撰写。

您也可以将健康检查添加到数据库容器,并为Web服务器容器添加条件。 像这样的东西。

 healthcheck: test: ["CMD-SHELL", "mysql_check.sh"] interval: 30s timeout: 30s retries: 3 

 depends_on: mysql-database: condition: service_healthy 

在启动Web服务器容器之前,撰写将等待数据库准备就绪。