我最初在Docker forums上发布了这个问题,但没有得到任何答复。
我想知道对一组服务建模的最佳方法是让我们称之为db
,web
和batch
。 db
只是一个正在运行的数据库服务器实例(想想MySQL)。 web
是需要连接到数据库的Web应用程序。 batch
是一个批处理应用程序,需要连接到同一个数据库(它可以/将与web
并行运行)。需要运行db
,才能运行web
或batch
。但web
或batch
可以彼此独立运行(其中一个或两个可以同时运行)。如果两者都在同时运行,则需要与同一个数据库实例进行通信(因此db
实际上正在使用volumes_from
单独的数据卷容器。因此,如果用例更简单(只考虑db
和web
,它们总是一起运行),那么它们只会被定义为同一个撰写文件中的服务,web
具有db
指向db
的链接。
据我了解,这些都不能在同一个Docker组合配置中定义。相反,我需要三种不同的配置。一个用于web
,一个用于external_links
(一个用于db
用于查找batch
),另一个用于external_links
(也用于db
db
找web
)。这是正确的,还是有一些机制我不考虑?假设需要进行多配置设置,当batch
或var 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')
)
组合,如果它没有运行?
答案 0 :(得分:1)
如果web
在docker-compose文件中的链接定义为db
,则db
将始终首先开始。
据我所知,Docker永远不会知道数据库何时启动。在基础启动(超时)之前,正确启动和重试将是web
容器的责任。
对于batch
服务,假设您每次启动web
和db
容器时都不想启动它(使用docker-compose up
或{ {1}}),您可以尝试扩展您的服务。有关详细信息,请参阅docs。
答案 1 :(得分:-1)
web
和batch
图像中的应用程序都知道如何处理数据库停机时间并且能够等待数据库服务启动并自动重新连接;您必须创建一个shell脚本,该脚本将在启动docker容器时运行,以便在启动应用程序之前等待db可用。
根据您用于web
和batch
服务的泊坞窗图片,您必须覆盖CMD
,ENTRYPOINT
或两者。
This question有shell脚本的例子,等待MySQL服务启动。
here是用于测试网络端口是否已打开的其他技术。