使用docker-compose构build公共依赖关系

假设我有一组图像取决于一个共同的基础图像:

  • 基地(这只是一组常见的依赖)

    FROM ubuntu:16.04 ENV FOO 1 
  • child1

     FROM mybaseimage # where mybaseimage corresponds to base CMD ["bar1_command"] 
  • 的child2

     FROM mybaseimage # where mybaseimage corresponds to base CMD ["bar2_command"] 

是否有可能创builddocker-compose文件而不运行它将构buildbase ? 可以说我有以下依赖关系:

 version: '2' services: child1: build: ./path-to-child1-dockerfile services: child2: build: ./path-to-child2-dockerfile depends_on: - child1 

即使没有明确的启动,我也希望构buildbase 。 这样的事情甚至可能吗? 或者我应该只使用外部的Makefile来build立依赖关系?

 build_base: docker build -t mybaseimage mybaseimage build_all: build_base docker-compose build 

使用一个Makefile。 docker-compose不是用来构build图像链的,它是为运行容器而devise的。

你也可能对dobi这个devise用于docker镜像和容器的build-automation工具(比如make)感兴趣。

免责声明:我是dobi的作者

这是可能的。 有一种解决方法。 你很接近,但你缺less显式的图像标签(所以你没有能力在孩子的图像声明你从哪个图像inheritance)。

 version: '3.2' services: base: image: mybaseimage build: ./path-to-base-dockerfile child1: build: ./path-to-child1-dockerfile depends_on: - base child2: build: ./path-to-child2-dockerfile depends_on: - base 

假设你没有build立图像。 你运行docker-compose up 。 以下事情将会发生:

  • docker-compose看到child1和child2服务依赖于基础。 所以它会先部署基地。
  • docker-compose发现你还没有将任何图像标记为mybaseimage 。 它知道如何构buildmybaseimage (你给它一个构buildpath),所以它现在将构build它,并将其标记为mybaseimage
  • docker-compose部署base服务。
    • 理想情况下,你应该devisebase ,使其立即退出,或没有入口点。 因为我们实际上并不希望它运行这个服务。
  • docker-compose考虑部署child1和child2
  • docker-compose发现你还没有将任何图像标记为child1 。 它知道如何构buildchild1 (你给它一个构buildpath),所以它现在将构build它,并将其标记为child1
  • docker-compose部署child1服务
  • child2的相同步骤序列

下一个docker-compose up会更简单(我们已经标记了可用的图像,所以我们跳过所有的构build步骤)。

如果你已经有标签的图像,并且想重build:使用docker-compose build来告诉它build立所有的图像(是的,base和children都将被重build)。

这在docker-compose 1.8.1中起作用