Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/55.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Mysql Docker:依赖另一个容器延迟启动操作?_Mysql_Docker_Supervisord - Fatal编程技术网

Mysql Docker:依赖另一个容器延迟启动操作?

Mysql Docker:依赖另一个容器延迟启动操作?,mysql,docker,supervisord,Mysql,Docker,Supervisord,我有两种Docker容器:一种带有web应用程序(nginx/php-fpm),另一种带有MySQL数据库。两者都通过网络连接。应用程序容器知道DB容器,但是DB不知道是否有零个、一个或多个应用程序容器可用。这两种类型的容器都使用Supervisord 数据库容器必须启动mysqld,这可能需要几秒钟的时间。 另一个容器必须执行一些启动操作,其中一部分需要访问数据库。由于这些操作取决于DB容器,因此我在脚本顶部放置了一个循环,等待DB服务器可用: try=0 ok=0 until mysql

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

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

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
虽然这确实有效,但我看到了两个缺点:首先,如果DB容器关闭,或者当应用容器启动时,脚本启动所需的时间超过某个超时时间,那么脚本将失败。其次,应用程序容器不知道数据库服务器上是否有更改(例如迁移)

虽然我知道,但我想知道:我如何才能将此类事件通知同一网络中任意数量的其他容器


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

您可能需要使用Compose

您还可以向数据库容器中添加healthcheck,并为web服务器容器添加条件。像这样的

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


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

谢谢,这看起来很有趣。我实际上是在使用Compose来处理设置。但是,我不想依赖它,因为我希望容器能够与云服务和其他容器管理器一起使用。因此,我更喜欢在容器中运行基于发现和事件的解决方案。我知道,Docker Compose看起来与一些云服务兼容(例如Amazon ECS)。Orchestrator还可以帮助您(Kubernetes或Swarm),因为它们中的大多数都支持组合。我真的不用Supervisord,所以我真的不能帮你更多。
depends_on:
  mysql-database:
    condition: service_healthy