13

I have a docker-compose.yml which looks like

version: '2'
services:
  redis:
    image: redis

  mysqldb:
    image: mysql:5.7
    environment:
      - MYSQL_ROOT_PASSWORD=passme
      - MYSQL_DATABASE=mydb
      - MYSQL_USER=root

  base:
    build: .
    volumes:
      - .:/proj
    environment:
      - ENV_1=Value_1
      - ENV_2=Value_2
      - ENV_3=Value_3

  worker:
    extends:
      service: base
    command: celery -A proj worker --loglevel=debug
    links:
      - redis
      - mysqldb
    depends_on:
      - mysqldb

  web:
    extends:
      service: base
    links:
      - mysqldb
      - redis
    depends_on:
      - mysqldb
    ports:
      - "8000:8000"
    command: python manage.py runserver 0.0.0.0:8000


Now, I want to upgrade it to version-3.

From the doc

The extends keyword is supported in earlier Compose file formats up to Compose file version 2.1 (see extends in v1 and extends in v2), but is not supported in Compose version 3.x



So, here is my question, How can I use Version-3 docker-compose file without losing my current functionalities?

kenorb
  • 155,785
  • 88
  • 678
  • 743
JPG
  • 82,442
  • 19
  • 127
  • 206
  • See also the new (Q3 2023) [`include` section in compose 2.20](https://stackoverflow.com/a/76942622/6309) – VonC Aug 21 '23 at 05:45

2 Answers2

6

Update:

With docker-compose 1.27, extends is supported again for version 3: https://github.com/docker/compose/pull/7588

Chung
  • 174
  • 1
  • 3
  • 10
  • is there any plan to officially support this in v3 or is this fleeting compatibility? – wizzfizz94 Jul 21 '21 at 07:20
  • Version is deprecated https://github.com/compose-spec/compose-spec/blob/a5a952ea97577169fff9f0b26854a9d92c3437ee/spec.md#compose-file – Chung Nov 26 '21 at 09:49
5

Extending services isn't supported in version 3 after removal of extends.

As for workaround, you can use docker-compose addons, e.g.

include:
    - http://example.com/compositions/servicea.yaml
    - http://example.com/compositions/serviceb.yaml

namespace: core

web:
    image: example/service_a:latest
    links: ['servicea.web', 'serviceb.api']

Another way is to include multiple composer files from the command-line (with multiple -f options). See: Add support for multiple composefile when deploying. E.g.

docker-compose -f submodules/A_SUB_PROJECT/docker-compose.yml -f submodules/B_SUB_PROJECT/docker-compose.yml config | docker-compose -f - up

Source: When using multiple docker-compose.yml files from different directories, local paths are not followed correctly.


In general, version 3 is more ideal for Swarm/Kube stacks, so consider using it.

E.g.

docker stack deploy -c docker-compose.yml mystack1
docker stack deploy -c another/docker-compose.yml mystack2

If you're not using Swarm or Docker Enterprise Kubernetes stacks, there is no reason to use v3. Stick with v2.4, and you get all the docker-compose cli features including extends, depends_on, extension fields, and even depends_on with healthchecks (to avoid wait-for-it scripts).


Related:

kenorb
  • 155,785
  • 88
  • 678
  • 743