我正在尝试运行从同一图像构建的多个容器。我的问题是当我以这种方式定义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
我会根据需要获得三个容器,但我也会得到三个图像。
如果我有数百个容器,我不喜欢有数百个图像的想法。这使我的本地图像存储库完全无法使用且无法读取。
思考并寻找解决方案我尝试自己定义横杆图像,然后重复使用它:
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
现在,我只有一个所有容器的图像,但也获得了一个app-crossbar容器。这也不符合我的需要。
有没有办法让docker-compose
有效地管理我的图像,只制作我需要的图像然后用它们来运行所需的任何数量的容器?或者我是否必须在其他一些例程中单独管理我的图像?我喜欢打电话:
docker-compose build
重建所有需要的图像,我喜欢将所有docker逻辑保存在一个地方的想法。
答案 0 :(得分:6)
首先构建crossbar
图像并正确标记它。然后,您可以使用该图像生成多个服务。此处的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
预先构建图像(以及可能将它们存储在docker图像仓库中)的一个巨大优势是,您可以在需要时恢复到旧版本。此外,如果需要,您可以使用预构建映像运行测试。
设置CI设置非常标准,例如Jenkins构建crossbar
项目的新图像(当您推动分支时),正确标记它将图像推送到您的私有(或公共)图像回购。
我会说,即使你可以使用compose构建图像,这仍然不是为prod做的正确方法。如果扩展图像以添加包含配置文件的图层,则可以接受。通过预先构建图像,您的管道也可以与swarm和其他集群环境兼容。
如果这对您的需求来说太过分了,那么您只需在本地构建(并正确标记图像)。标记部分很重要,因此您不必与docker缓存竞争,如果需要还原,您仍然可以找到旧版本。
(在开发环境中,您可以更加粗心,只需在主机和容器的目录和文件中进行映射。没有人想为每一次更改重新构建)