如何使docker-compose构build映像一次并反复使用它来运行容器?

我试图运行从同一图像构build的多个容器。 我的问题是,当我这样定义我docker-compose.yml

 version: '3' services: crossbar-target: container_name: "app-crossbar-target" build: context: ../../crossbar crossbar-source-domain1: container_name: "app-crossbar-source-domain1" build: context: ../../crossbar crossbar-source-domain2: container_name: "app-crossbar-source-domain2" build: context: ../../crossbar 

我会得到三个容器,但是我也有三个图像。

如果我有数百个容器,我不喜欢有数百个图像的想法。 这使我的本地映像存储库完全无法使用,无法读取。

思考和寻找解决scheme我试着自己定义交叉开发图像,然后重新使用它:

 version: '3' services: app-crossbar: build: context: ../../crossbar crossbar-target: container_name: "app-crossbar-target" image: project_name/app-crossbar crossbar-source-domain1: container_name: "app-crossbar-source-domain1" image: project_name/app-crossbar crossbar-source-domain2: container_name: "app-crossbar-source-domain2" image: project_name/app-crossbar 

现在,我只有一个图像的所有容器,但也有一个应用程序交叉开关容器。 这也不符合我的需求。

有没有什么办法让docker-composepipe理我的图像高效,只有我需要的图像,然后使用它们来运行所需的任何数量的容器? 还是我必须在其他例程中分别pipe理我的图像? 我喜欢打电话:

 docker-compose build 

重build所有需要的图像,我喜欢所有我的docker逻辑在一个地方的想法。

首先构buildcrossbar图像并正确标记它。 然后,您可以使用该图像产生多个服务。 这里latest标签只是一个例子。 我会使用一个独特的版本号。

 version: '3' services: app-crossbar: image: crossbar:latest crossbar-target: image: crossbar:latest crossbar-source-domain1: image: crossbar:latest crossbar-source-domain2: image: crossbar:latest 

预先构build图像(可能将其存储在Docker镜像库中)的一个巨大优势是可以在需要时恢复到旧版本。 另外,如果需要,您可以使用预先构build的图像运行testing。

有一个CI设置是非常标准的,例如Jenkins生成一个新的crossbar项目图像(当你推动一个分支时),正确地标记它将图像推到你的私人(或公共)图像仓库。

我想说,即使你可以用合成的方式来构build图像,那仍然不是正确的方法。 如果你扩展你的图像来添加一个包含configuration文件的图层,这可能是可以接受的。 通过预先构build映像,您的pipe道也与群集和其他群集环境兼容。

如果这是为了你的需要矫枉过正,你只需在本地构build(并正确标记图像)。 标记部分是非常重要的,所以你不必与dockercaching战斗,如果需要恢复,仍然可以find旧版本。

(在一个开发环境中,你可能更加粗心,只需将目录和文件从主机映射到容器,没有人希望为每一次更改重新构build)