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

8 docker docker-compose

假设我有这个项目结构:

proj/
??? docker
?   ??? myservice
?       ??? Dockerfile
??? docker-compose.yml
Run Code Online (Sandbox Code Playgroud)

这是我的docker-compose.yml

version: '3'

services:

  master:
      build: docker/myservice

  slave:
      image: proj_master
      depends_on: master
Run Code Online (Sandbox Code Playgroud)

我希望该master服务创建一个映像,该映像将由masterslave服务使用(具有不同的参数,此处未显示)。通过反复试验,我发现从属必须引用该映像proj_master

  • 这在哪里记录?
  • 为什么需要参考proj?通常docker composer文件与它的位置无关...

Ale*_*ler 10

此功能称为扩展字段

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

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 
Run Code Online (Sandbox Code Playgroud)

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

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

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

一篇关于这个主题的完美文章

另请查看这篇关于在一个容器中运行多个进程的文章。

很酷的黑客,是吧?

  • 这应该是首选答案。感谢您发布此内容! (3认同)
  • 很有意思!发现这叫做[YAML merge](https://yaml.org/type/merge.html),我从未听说过。docker-compose 的用法记录在[此处](https://docs.docker.com/compose/compose-file/#extension-fields)。我想说这应该小心使用,我会使用 YAML 锚点(参考资料位于 docker-compose 的同一链接中)。 (2认同)

Yar*_*dan 8

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

version: '3'

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

  slave:
    image: master-image:3
Run Code Online (Sandbox Code Playgroud)


Mar*_*ark 7

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

您有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
Run Code Online (Sandbox Code Playgroud)

  • 我们可以一起使用 **build** 和 **image** 吗?! (2认同)
  • 尝试了这个,但它在拉取时失败,因为它试图拉取不存在的图像 (2认同)

tan*_*y_k 6

services:\n  master:\n    image: master-image\n    pull_policy: never\n    build: docker/myservice\n\n  slave:\n    image: master-image\n    pull_policy: never\n
Run Code Online (Sandbox Code Playgroud)\n

如果没有pull_policydocker compose可以工作,但对从站显示红色错误,对主站显示警告:

\n

\xc2\xa0\xe2\xa0\xbf 从站拉动
\n\xc2\xa0\xe2\xa0\xbf 主站拉动

\n

\xc2\xa0\xe2\xa0\xbf 从站错误
\n\xc2\xa0\xe2\xa0\xbf 主站警告

\n

更多信息:https://github.com/docker/compose/issues/9820,https : //docs.docker.com/compose/compose-file/#pull_policy

\n
\n

pull_policy:从不
\nCompose 实现不应从注册表中提取映像 [...]

\n
\n

其他备注:

\n\n

  • 很棒的东西。我想“pull_policy: never”对我来说是关键。 (2认同)