如何使docker-compose构建一次图像并重复使用它来运行容器?

时间:2017-07-26 12:16:25

标签: docker docker-compose

我正在尝试运行从同一图像构建的多个容器。我的问题是当我以这种方式定义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逻辑保存在一个地方的想法。

1 个答案:

答案 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缓存竞争,如果需要还原,您仍然可以找到旧版本。

(在开发环境中,您可以更加粗心,只需在主机和容器的目录和文件中进行映射。没有人想为每一次更改重新构建)