我有三个服务要构建,A,B和C.应该首先构建A,因为B和C依赖于A(它们将A导入为图像)。我认为它们应该按顺序构建,但我发现它们是按照随机顺序构建的?
那么,如何在docker-compose.yml
中控制构建顺序?
答案 0 :(得分:10)
<强>更新强> 在最近的实践中,我发现我的答案仅适用于运行排序 请参阅Quinten Scheppermans的回答和Authur Weborg关于 dobi 的评论。
您可以使用depends_on
指令控制构建顺序。
services:
...
B:
depends_on:
- A
C:
depends_on:
- A
答案 1 :(得分:4)
上面接受的答案似乎不正确。
中所示使用depends_on时需要注意几点:
depends_on不等待db和redis之前“准备好” 启动网站 - 直到它们已经启动。如果你需要等待 要使服务准备就绪,请参阅控制启动顺序以获取更多信息 这个问题和解决它的策略。
版本3不再支持depends_on的条件形式。
在群集模式下部署堆栈时,将忽略depends_on选项 使用版本3撰写文件。
答案 2 :(得分:2)
如果您需要先运行一项服务,则可以在docker-compose.yml文件中设置docker-compose run bar
后使用depends_on: - foo
。
例如:
# docker-compose.yml
services:
foo:
. . .
bar:
. . .
depends_on:
- foo
然后跑步
# terminal
user@Name Docker % docker-compose run bar
但是,对于docs,这将仅控制进程开始的顺序,而不控制进程结束的顺序。这通常会导致依赖服务无法正确启动的情况。可能的解决方案包括使用wait-for-it,wait-for或Dockerise。建议您在实施上述任何解决方案之前先阅读docs,因为有一些警告。
答案 3 :(得分:0)
在可能的情况下保留self.services的原始顺序,并根据需要重新排序以解决依赖关系。
因此,对我来说,它的工作方式是先对服务和相关服务进行手动排序,然后再跟踪彼此使用的服务。
示例
version: '3'
services:
mydb:
image: mydb
serviceA:
build:
dockerfile: DockerfileA
depends_on:
- mydb
serviceB:
build:
dockerfile: DockerfileB # which contains 'FROM serviceA'
depends_on:
- mydb
来源:https://github.com/docker/compose/issues/5228#issuecomment-565469948