docker 在另一个服务中重用由一个服务构建的映像

gajydyqb  于 2023-01-04  发布在  Docker
关注(0)|答案(4)|浏览(110)

假设我有这样的项目结构:

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文件与它的位置有关是不可知的。
yxyvkwin

yxyvkwin1#

Docker合成使用名称proj_master构建图像,因为您没有在合成文件的master服务下指定图像名称。
您有一个build节,因此Docker Compose将构建映像并基于您的<directory_name_where_you_run_compose>_<service_name>:latest为其命名。我在文档中没有找到这个,但在我的一个项目中尝试过,它与您的体验一致。
您可以通过在合成文件中指定图像名称并对两个服务使用相同的图像来修复项目:

version: '3'

services:

  master:
      build: docker/myservice
      image: username/masterimage:version

  slave:
      image: username/masterimage:version
      depends_on: master
1mrurvl1

1mrurvl12#

此功能称为扩展字段。
你可以把你的奴隶和你的主人联系起来。

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的文章。
很酷的黑客,是吧?

s8vozzvw

s8vozzvw3#

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

version: '3'

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

  slave:
    image: master-image:3
qyyhg6bp

qyyhg6bp4#

services:
  master:
    image: master-image
    pull_policy: never
    build: docker/myservice

  slave:
    image: master-image
    pull_policy: never

如果没有pull_policydocker compose可以正常工作,但对从机显示红色错误,对主机显示警告:
从动牵拉
主拉力
从属错误
主警告
More infos: https://github.com/docker/compose/issues/9820 , https://docs.docker.com/compose/compose-file/#pull_policy
拉取策略:从不
合成实现不应该从注册表中拉取映像[...]
其他备注:

  • No need for depends_on in this context ("expresses startup and shutdown dependencies between services"), see https://docs.docker.com/compose/compose-file/#depends_on
  • Do not use version: '3' , this field is deprecated https://github.com/compose-spec/compose-spec/blob/7d5c7c88676ac240b6b037f868c04b33f738d82a/spec.md#compose-file and also it is the equivalent of '3.0' instead of using the latest minor version https://docs.docker.com/compose/compose-file/compose-versioning/#version-3

相关问题