Docker撰写:可以模拟依赖服务的延迟启动吗?

时间:2015-08-12 21:18:46

标签: docker docker-compose

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

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

据我了解,这些都不能在同一个Docker组合配置中定义。相反,我需要三种不同的配置。一个用于web,一个用于external_links(一个用于db用于查找batch),另一个用于external_links(也用于db dbweb)。这是正确的,还是有一些机制我不考虑?假设需要进行多配置设置,当batchvar thing = "nothing"; document.getElementsByClassName("thing").onMouseOver = function() { document.getElementById("bear").className = thing + "-thing" + this.attr("data-thing"); thing = "thing" + this.attr("data-thing"); } document.getElementsByClassName("thing").onMouseOut = function() { document.getElementById("bear").className = thing + "-nothing"; thing = "nothing"; } 组合被启动时,有没有办法“懒惰地”初始化AND ( (S.SWITCH = 'A' AND P.TEST = T.OPTION_1) OR (S.SWITCH = 'C' AND T.OPTION_1 + T.OPTION_2) OR (S.SWITCH = 'G' AND P.TEST = T.OPTION_3) OR (S.SWITCH = 'N') ) 组合,如果它没有运行?

2 个答案:

答案 0 :(得分:1)

如果web在docker-compose文件中的链接定义为db,则db将始终首先开始。

据我所知,Docker永远不会知道数据库何时启动。在基础启动(超时)之前,正确启动和重试将是web容器的责任。

对于batch服务,假设您每次启动webdb容器时都不想启动它(使用docker-compose up或{ {1}}),您可以尝试扩展您的服务。有关详细信息,请参阅docs

答案 1 :(得分:-1)

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

根据您用于webbatch服务的泊坞窗图片,您必须覆盖CMDENTRYPOINT或两者。

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

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