我有两种类型的Docker容器:一种是带有Web应用程序(nginx / php-fpm),另一种是带有MySQL数据库的容器。两者都通过网络连接。应用程序容器知道数据库容器,但是,数据库不知道零个,一个或多个应用程序容器是否可用。两种类型的容器都使用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 events,但我想知道:如何在同一网络中通知任意数量的其他容器?
(注意:我不仅限于使用Supervisord,我只是觉得这是最有前途的方法。)
答案 0 :(得分:2)
您可能想要使用Compose。
您还可以向数据库容器添加运行状况检查,并为Web服务器容器添加条件。这样的事情。
healthcheck:
test: ["CMD-SHELL", "mysql_check.sh"]
interval: 30s
timeout: 30s
retries: 3
和
depends_on:
mysql-database:
condition: service_healthy
Compose将在启动Web服务器容器之前等待数据库准备就绪。