使用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
服务。- 理想情况下,你应该devise
base
,使其立即退出,或没有入口点。 因为我们实际上并不希望它运行这个服务。
- 理想情况下,你应该devise
- 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中起作用