【问题标题】:Reuse image built by one service in another service在另一个服务中重用由一个服务构建的图像
【发布时间】:2018-04-25 10:29:26
【问题描述】:

假设我有这个项目结构:

proj/
├── docker
│   └── myservice
│       └── Dockerfile
└── docker-compose.yml

这是我的docker-compose.yml

version: '3'

services:

  master:
      build: docker/myservice

  slave:
      image: proj_master
      depends_on: master

我希望master 服务创建一个图像,供masterslave 服务使用(参数不同,此处未显示)。通过反复试验,我发现从站必须引用图像proj_master

  • 记录在哪里?
  • 为什么我需要引用proj?通常,一个 docker composer 文件与它所在的位置无关......

【问题讨论】:

    标签: docker docker-compose


    【解决方案1】:

    Docker Compose 使用名称 proj_master 构建您的镜像,因为您没有在 Compose 文件中的 master 服务下指定镜像名称。

    您有一个 build 部分,因此 Docker Compose 将构建映像并根据您的 <directory_name_where_you_run_compose>_<service_name>:latest 为其命名。我在文档中没有找到这个,但尝试了我的一个项目,它与您的经历一致。

    您可以通过在 Compose 文件中指定图像名称并为两种服务使用相同的图像来修复您的项目:

    version: '3'
    
    
    services:
    
      master:
          build: docker/myservice
          image: username/masterimage:version
    
    
      slave:
          image: username/masterimage:version
          depends_on: master
    

    【讨论】:

    • 我们可以同时使用 buildimage 吗?!
    • @MahdiImani 你在一起是什么意思?我们通常在同一个服务下同时使用buildimagebuild 告诉 docker 如何构建,image 告诉 docker 镜像名称应该是什么。他们有点在一起 :) 你还想实现什么?
    • 试过了,但是在拉取时失败了,因为它试图拉取不存在的图像
    • @dalore 没错,在docker-compose pull 上它抱怨 ERROR: manifest for image-name:tag not found: manifest unknown: manifest unknown,因为没有上游/注册表图像那个名字的存在。这就是我现在回滚以使用复制粘贴/湿配置的原因,另请参阅here
    【解决方案2】:

    此功能称为extension fields

    你可以将你的奴隶链接到你的主人。

    django_project: 
      &django_project
      image: python:3.7.6-alpine
       command: ....  
    
    django_project_task1:
      <<: *django_project
      command: /start-task1.sh 
    
    django_project_task2:
      <<: *django_project
      command: /start-task2.sh 
    

    现在所有共享相同的源,但使用不同的命令启动。

    此外,您还必须了解一件事。

    由于 Docker 使用“层”,您的 Dockerfile 不会为每个“子进程”重新编译,并且卷大小将会缩小。

    有一个完美的article on this topic

    还可以查看这篇关于 running multiple process in one container 的文章。

    很酷的技巧,嗯?

    【讨论】:

    • 非常有趣!发现这叫YAML merge,我从来没有听说过。 docker-compose 用法记录在 here。我想说这应该小心使用,我会改用 YAML 锚(参考在 docker-compose 的同一链接中)。
    • 这应该是首选答案。感谢您发布此信息!
    【解决方案3】:

    如果您在docker-compose.yaml 中使用以下语法,则该映像将由 master 构建一次,然后由 slave 使用:

    version: '3'
    
    services:
      master:
        build: docker/myservice
        image: master-image:3
    
      slave:
        image: master-image:3
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 2011-06-07
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2013-12-22
      相关资源
      最近更新 更多