【问题标题】:Docker compose: possible to model lazy startup of dependent services?Docker compose:可以对依赖服务的延迟启动进行建模吗?
【发布时间】:2016-02-26 15:53:05
【问题描述】:

我最初在Docker forums 上发布了这个问题,但没有得到任何回复。

我想知道为一组服务建模的最佳方法是什么,我们称它们为 dbwebbatchdb 只是一个正在运行的数据库服务器实例(想想 MySQL)。 web 是一个需要连接数据库的 Web 应用程序。 batch 是一个批处理应用程序,需要连接到同一个数据库(它可以/将与web 并行运行)。 db 需要运行,webbatch 才能运行。但是webbatch 可以相互独立运行(其中一个或两个可以同时运行)。如果两者同时运行,则它们需要与同一个数据库实例通信(因此db 实际上是在使用volumes_from 一个单独的数据卷容器)。因此,如果用例更简单(想想dbweb,它们总是一起运行),那么它们将被简单地定义为同一个撰写文件中的服务,web 具有指向db 的链接.

据我了解,这些不能都在同一个 Docker compose 配置中定义。相反,我需要三种不同的配置。一个用于db,首先启动,一个用于web(使用external_links 查找db),第三个用于batch(也使用external_links 查找db)。这是正确的,还是有一些我没有考虑的可用机制?假设需要多配置设置,如果 db 组合没有运行,有没有办法在启动 webbatch 组合时“懒惰地”初始化它?

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    如果 web 在 docker-compose 文件中定义了指向 db 的链接,db 将始终首先启动。

    据我所知,Docker 永远不会知道数据库何时启动。您的web 容器有责任正确启动并重试,直到基础启动(超时)。

    对于您的batch 服务,假设您不想在每次启动webdb 容器时都启动它(使用docker-compose uprun),您可以尝试扩展您的服务.有关这方面的更多信息,请参阅docs

    【讨论】:

      【解决方案2】:

      webbatch 映像中的应用程序都知道如何处理数据库停机时间,并且能够等待数据库服务启动并自动重新连接;要么您必须制作一个 shell 脚本,该脚本将在启动 docker 容器时运行,以等待 db 在启动应用程序之前可用。

      根据您用于 webbatch 服务的 docker 映像,您必须覆盖 CMDENTRYPOINT 或两者。

      This question 有等待 MySQL 服务启动的 shell 脚本示例。

      here是其他测试网络端口是否打开的技术。

      【讨论】:

      • 这解决了如何使其他应用程序正确依赖数据库的问题。但是我仍然不清楚 Docker 或 Docker Compose 是否具有内置工具来启动数据库本身在任何依赖服务启动时(这显然需要处理一个状态数据库尚未运行)。
      • Docker 和 docker-compose 都不知道容器内运行的东西。知道这一点不是他们的事
      • 没错。但是,docker-compose 允许您在外部定义这些依赖项(通过linksexternal_links 等)。我的问题是在建模的背景下提出的。
      • 如果您要制作不同的 docker-compose 配置文件,那么您必须手动启动 db 并等待它启动,然后手动启动其他的。或者,您必须想出某种 shell 脚本来为您做同样的事情。它不会改变问题:某种方式或另一种方式必须等待数据库启动
      猜你喜欢
      • 2010-12-07
      • 1970-01-01
      • 2017-07-27
      • 1970-01-01
      • 2019-03-18
      • 2021-07-14
      • 2021-08-27
      • 1970-01-01
      • 2022-01-23
      相关资源
      最近更新 更多