如何控制docker-compose构建顺序?

时间:2017-09-19 08:43:33

标签: docker docker-compose

我有三个服务要构建,A,B和C.应该首先构建A,因为B和C依赖于A(它们将A导入为图像)。我认为它们应该按顺序构建,但我发现它们是按照随机顺序构建的?

那么,如何在docker-compose.yml中控制构建顺序?

4 个答案:

答案 0 :(得分:10)

  

<强>更新   在最近的实践中,我发现我的答案仅适用于运行排序   请参阅Quinten Scheppermans的回答和Authur Weborg关于 dobi 的评论。

您可以使用depends_on指令控制构建顺序。

services:
  ...

  B:
    depends_on:
      - A
  C:
    depends_on:
      - A

答案 1 :(得分:4)

上面接受的答案似乎不正确。

documentation

中所示
  

使用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-itwait-forDockerise。建议您在实施上述任何解决方案之前先阅读docs,因为有一些警告。

答案 3 :(得分:0)

https://github.com/docker/compose/blob/e9220f45df07c1f884d5d496507778d2cd4a1687/compose/project.py#L182-L183

中所述

在可能的情况下保留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