Почему этот докер компилирует один и тот же образ четыре раза?

Когда я запускаю docker-compose build в следующем файле docker-compose, предназначенном для сервера django с сельдереем, он создает идентичное изображение четыре раза (для службы web, celeryworker, celerybeat и flower).

Весь процесс повторяется четыре раза

Я думал, что смысл наследования описаний других сервисов в docker-compose заключается в том, чтобы вы могли повторно использовать один и тот же образ для разных сервисов?

Как я могу повторно использовать изображение web в других сервисах, чтобы сократить время сборки на 75%?

version: '3'

services:
  web: &django
    image: myorganisation/myapp
    container_name: myapp_web
    build:
        context: .
        dockerfile: ./compose/local/django/Dockerfile
        # This is a multistage build installing private dependencies, hence this arg is needed
        args:
          PERSONAL_ACCESS_TOKEN_GITHUB: ${PERSONAL_ACCESS_TOKEN_GITHUB}
    command: /start
    volumes:
      - .:/app
    ports:
      - 8000:8000
    depends_on:
      - db
      - redis
    environment:
      - DJANGO_SETTINGS_MODULE=backend.settings.local
      - DATABASE_URL=postgres://postgres_user:postgres_password@db/postgres_db
      - REDIS_URL=redis://:redis_password@redis:6379
      - CELERY_FLOWER_USER=flower_user
      - CELERY_FLOWER_PASSWORD=flower_password
    env_file:
      - ./.env

  celeryworker:
    <<: *django
    container_name: myapp_celeryworker
    depends_on:
      - redis
      - db
    ports: []
    command: /start-celeryworker

  celerybeat:
    <<: *django
    container_name: myapp_celerybeat
    depends_on:
      - redis
      - db
    ports: []
    command: /start-celerybeat

  flower:
    <<: *django
    container_name: myapp_flower
    ports:
      - 5555:5555
    command: /start-flower

volumes:
  postgres_data:
    driver: local
  pgadmin_data:
    driver: local
Почему в Python есть оператор &quot;pass&quot;?
Почему в Python есть оператор "pass"?
Оператор pass в Python - это простая концепция, которую могут быстро освоить даже новички без опыта программирования.
Коллекции в Laravel более простым способом
Коллекции в Laravel более простым способом
Привет, читатели, сегодня мы узнаем о коллекциях. В Laravel коллекции - это способ манипулировать массивами и играть с массивами данных. Благодаря...
JavaScript Вопросы с множественным выбором и ответы
JavaScript Вопросы с множественным выбором и ответы
Если вы ищете платформу, которая предоставляет вам бесплатный тест JavaScript MCQ (Multiple Choice Questions With Answers) для оценки ваших знаний,...
Массив зависимостей в React
Массив зависимостей в React
Все о массиве Dependency и его связи с useEffect.
0
0
84
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Поскольку вы указываете раздел build во всех сервисах (используя якорь django), он создается для каждого сервиса.

Если вы хотите использовать один и тот же образ для всех сервисов, но собрать его только один раз, вы можете указать раздел build только в одном сервисе, который будет запускаться первым (то есть сервис без зависимостей), а затем указать только поле image без раздела build в других службах и сделать эти службы зависимыми от первой службы, которая создает образ.

Так что повторите image: myorganisation/myapp в других, но потеряйте <<<django?

thclark 18.12.2020 19:53

Да. в основном есть раздел build в одном сервисе, повторяйте image во всех сервисах, сделайте все сервисы зависимыми от сервиса, в котором есть раздел build.

Shashank V 18.12.2020 20:29

Другие вопросы по теме