重用另一个服务中由一个服务构建的图像

时间:2018-04-25 10:29:26

标签: docker docker-compose

假设我有这个项目结构:

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文件与它所在的位置无关......

3 个答案:

答案 0 :(得分:3)

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

version: '3'

services:
  master:
    build: docker/myservice
    image: master-image:3

  slave:
    image: master-image:3

答案 1 :(得分:3)

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

答案 2 :(得分: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的这篇文章。

很酷,是吧?