Повторно использовать образ, созданный одним сервисом, в другом сервисе

Допустим, у меня есть такая структура проекта:

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 создала изображение, которое будет использоваться службами master и slave (с другими параметрами, здесь не показаны). Методом проб и ошибок выяснил, что подчиненное устройство должно ссылаться на изображение proj_master.

  • Где это задокументировано?
  • Зачем мне делать ссылку на proj? Обычно файл docker composer не зависит от того, где он находится ...

person Community    schedule 25.04.2018    source источник


Ответы (3)


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
person takacsmark    schedule 25.04.2018
comment
можем ли мы использовать build и image вместе?! - person Mahdi Imani; 29.09.2019
comment
@MahdiImani, что ты имеешь в виду вместе? Обычно мы используем build и image вместе в одной и той же службе. build сообщает докеру, как строить, а image сообщает докеру, каким должно быть имя образа. Они вроде как вместе :) Чего еще ты пытаешься добиться? - person takacsmark; 29.09.2019
comment
попробовал это, но он не работает при извлечении, поскольку пытается вытащить несуществующее изображение - person dalore; 29.06.2020
comment
@dalore Точно, docker-compose pull он жалуется на ERROR: manifest for image-name: tag not found: manifest unknown: manifest unknown, поскольку не существует образа восходящего потока / реестра с таким именем. Вот почему я сейчас откатываю это назад, чтобы использовать скопированные / WET-конфигурации, см. Также здесь. - person Alex Povel; 07.01.2021
comment
Он отлично работает для меня. Спасибо. - person Vikram Ray; 15.01.2021

Эта функция называется полями расширения.

Вы можете просто связать своих рабов со своим хозяином.

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 не будет перекомпилироваться для каждого подпроцесса, а размер тома будет уменьшаться.

На эту тему есть отличная статья

Также ознакомьтесь с этой статьей о запуске нескольких процессов в одном контейнере.

Классный хак, а?

person Alexander Paul Wansiedler    schedule 18.01.2020
comment
Очень интересно! Обнаружено, что это называется слияние YAML, о котором я никогда не слышал. Использование docker-compose описано здесь. Я бы сказал, что это следует использовать с осторожностью, и вместо этого я бы использовал якоря YAML (ссылки находятся в той же ссылке для docker-compose). - person Ricardo Correa; 31.03.2020
comment
Это должен быть предпочтительный ответ. Спасибо, что разместили это! - person alete; 04.05.2021

Если вы используете следующий синтаксис в docker-compose.yaml, изображение будет построено один раз мастером, а затем использовано подчиненным:

version: '3'

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

  slave:
    image: master-image:3
person Yaron Idan    schedule 25.04.2018