假设我有一组依赖于共同基本图像的图像:
base(这只是一组常见的依赖项)
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"]
是否有可能创造 docker-compose
将构建的文件 base
没有运行它?假设我有以下依赖项:
version: '2'
services:
child1:
build: ./path-to-child1-dockerfile
services:
child2:
build: ./path-to-child2-dockerfile
depends_on:
- child1
我想要 base
即使没有明确启动也要构建。这样的事情甚至可能吗?或者我应该只使用外部Makefile来构建依赖项?
build_base:
docker build -t mybaseimage mybaseimage
build_all: build_base
docker-compose build
使用Makefile。 docker-compose不是为构建图像链而设计的,它是为运行容器而设计的。
你也可能对此有兴趣 DOBI 这是一个构建自动化工具(如make),用于处理docker镜像和容器。
免责声明:我是作者 DOBI
这是可能的。有一种解决方法。你很接近,但是你错过了明确的图像标签(因此你很难在子图像上声明你继承了哪个图像)。
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
假设您没有构建图像。你跑 docker-compose up
。将发生以下事情:
- docker-compose看到child1和child2服务依赖于base。所以它将首先部署基础。
- docker-compose看到你还没有标记任何图像
mybaseimage
。它知道如何建立 mybaseimage
(你给它一个构建路径),所以它现在将构建它,并将其标记为 mybaseimage
。
- docker-compose部署了
base
服务。
- 理想情况下你应该设计
base
这样它就会立即退出,或者没有入口点。因为我们没有 其实 希望它运行此服务。
- docker-compose考虑部署child1和child2
- docker-compose看到你还没有标记任何图像
child1
。它知道如何建立 child1
(你给它一个构建路径),所以它现在将构建它,并将其标记为 child1
。
- docker-compose部署了
child1
服务
- child2的步骤顺序相同
下一个 docker-compose up
将更简单(我们已标记图像可用,因此我们跳过所有构建步骤)。
如果您已经有标记图像,并且想要重建:使用 docker-compose build
告诉它建立所有图像(是的,基础和孩子都将被重建)。