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

Wax*_*age 5 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
Run Code Online (Sandbox Code Playgroud)

我会得到三个容器,但我也得到三个图像.

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

思考和搜索解决方案我尝试自己定义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
Run Code Online (Sandbox Code Playgroud)

现在,我只有一个容器的图像,但也获得了一个app-crossbar容器.这也不符合我的需要.

有没有办法有效地docker-compose管理我的图像,只制作我需要的图像,然后使用它们运行所需的任何数量的容器?或者我是否必须在其他一些例程中单独管理我的图像?我喜欢打电话:

docker-compose build
Run Code Online (Sandbox Code Playgroud)

重建所有需要的图像,我喜欢我的所有docker逻辑都保存在一个地方的想法.

Gri*_*mmy 7

首先构建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
Run Code Online (Sandbox Code Playgroud)

预先构建图像(以及可能将它们存储在docker image repo中)的一个巨大优势是,您可以在需要时恢复到旧版本.此外,如果需要,您可以使用预构建映像运行测试.

拥有CI设置非常标准,例如Jenkins构建crossbar项目的新图像(当您推动分支时),正确地标记它将图像推送到您的私人(或公共)图像仓库.

我会说,即使你可以用compose构建图像,这仍然不是生产它的正确方法.如果扩展图像以添加包含配置文件的图层,则可以接受.通过预先构建图像,您的管道也可以与swarm和其他集群环境兼容.

如果这对您的需求来说太过分了,那么您只需在本地构建(并正确标记图像).标记部分很重要,因此您不必与docker缓存竞争,如果需要还原,您仍然可以找到旧版本.

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

  • 但是我可以让 docker-compose 来处理我的 crossbar 图像吗?我希望将所有内容集中在一处,而不必单独维护我的图像。我喜欢调用 docker-compose 来处理一切...... (2认同)
  • 正如其他人所说,您必须自己管理本地映像。只需将所需的图像推送到私有或公共注册表即可。例如,您可以设置一个清理cron作业,该作业将运行docker system prune来清理所有未使用/悬挂的本地映像。@Grimmy的答案是正确的。 (2认同)