Когда я запускаю 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
Поскольку вы указываете раздел build во всех сервисах (используя якорь django), он создается для каждого сервиса.
Если вы хотите использовать один и тот же образ для всех сервисов, но собрать его только один раз, вы можете указать раздел build только в одном сервисе, который будет запускаться первым (то есть сервис без зависимостей), а затем указать только поле image без раздела build в других службах и сделать эти службы зависимыми от первой службы, которая создает образ.
Да. в основном есть раздел build в одном сервисе, повторяйте image во всех сервисах, сделайте все сервисы зависимыми от сервиса, в котором есть раздел build.
Так что повторите image: myorganisation/myapp в других, но потеряйте <<<django?