Skip to content

[BUG] Scaling a service leads to a different com.docker.compose.config-hash #10077

Closed
@agross

Description

@agross

Description

With docker-compose v1, when scaling a service from 1 to 2 instances the .Config.Labels['com.docker.compose.config-hash'] stays constant compared to the first instance.

docker compose v2 sets a different config hash which leads to unnecessary service restarts.

If you run docker compose up after scaling up, the second instance is restarted only to receive the same config-hash as the first instance, so both instances share the same hash.

Steps To Reproduce

Compose file:

version: '2.4'

services:
  test:
    image: nginx:alpine

Compose v1 behavior:

$ ./docker-compose up -d
Creating network "test_default" with the default driver
Creating test_test_1 ... done

$ docker inspect test_test_1 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"c0c748ebbe5ec50f7ab2feec46a9129f2f77d6b085528bd03bd14723e209cd00"

$ ./docker-compose up -d --scale test=2 --no-recreate
Creating test_test_2 ... done

$ docker inspect test_test_1 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"c0c748ebbe5ec50f7ab2feec46a9129f2f77d6b085528bd03bd14723e209cd00"

$ docker inspect test_test_2 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"c0c748ebbe5ec50f7ab2feec46a9129f2f77d6b085528bd03bd14723e209cd00"

# --> Config hashes are equal!

# Since compose v1 would remove the second instance (as default scale = 1),
# emulate that we have only the second instance left to see that compose up
# does not restart the second instance because it is up-to-date w.r.t. its config.
$ docker stop test_test_1 && docker rm test_test_1
test_test_1
test_test_1

$ ./docker-compose up -d
test_test_2 is up-to-date

Compose v2 behavior:

$ docker compose up -d
[+] Running 2/2
 ⠿ Network test_default   Created                                                                                                                   
 ⠿ Container test-test-1  Started

$ docker inspect test-test-1 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"bf6121f23746cbb8aa6e190dbdd370ed3928bc89066e458132ea9a62bcbc8edd"

$ docker compose up -d --scale test=2 --no-recreate
[+] Running 2/2
 ⠿ Container test-test-1  Running                                                                                                                   
 ⠿ Container test-test-2  Started

$ docker inspect test-test-1 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"bf6121f23746cbb8aa6e190dbdd370ed3928bc89066e458132ea9a62bcbc8edd"

$ docker inspect test-test-2 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"02acadd37d42914645b29c9488bcfd5fa76a88f52a782b5eabf9086ab64d75aa"

# --> Config hashes differ!

$ docker compose up -d
[+] Running 1/1
 ⠿ Container test-test-2  Started

$ docker inspect test-test-2 | jq '.[0].Config.Labels["com.docker.compose.config-hash"]'
"bf6121f23746cbb8aa6e190dbdd370ed3928bc89066e458132ea9a62bcbc8edd"

# --> After restarting the second instance it now has the same hash as the first instance.

Compose Version

docker compose version: Docker Compose version v2.12.2
docker-compose version: docker-compose version 1.29.2, build 5becea4c

Docker Environment

Client:
 Context:    default
 Debug Mode: false
 Plugins:
  app: Docker App (Docker Inc., v0.9.1-beta3)
  buildx: Docker Buildx (Docker Inc., v0.9.1-docker)
  compose: Docker Compose (Docker Inc., v2.12.2)
  scan: Docker Scan (Docker Inc., v0.21.0)

Server:
 Containers: 33
  Running: 31
  Paused: 0
  Stopped: 2
 Images: 23
 Server Version: 20.10.21
 Storage Driver: overlay2
  Backing Filesystem: extfs
  Supports d_type: true
  Native Overlay Diff: true
  userxattr: false
 Logging Driver: json-file
 Cgroup Driver: systemd
 Cgroup Version: 2
 Plugins:
  Volume: local
  Network: bridge host ipvlan macvlan null overlay
  Log: awslogs fluentd gcplogs gelf journald json-file local logentries splunk syslog
 Swarm: inactive
 Runtimes: io.containerd.runc.v2 io.containerd.runtime.v1.linux runc
 Default Runtime: runc
 Init Binary: docker-init
 containerd version: a05d175400b1145e5e6a735a6710579d181e7fb0
 runc version: v1.1.4-0-g5fd4c4d
 init version: de40ad0
 Security Options:
  seccomp
   Profile: default
  cgroupns
 Kernel Version: 6.0.8-300.fc37.x86_64
 Operating System: Fedora Linux 37 (Thirty Seven)
 OSType: linux
 Architecture: x86_64
 CPUs: 2
 Total Memory: 7.572GiB
 Name: gw-prod
 ID: PM3U:4S5E:PLVU:ZTJB:XYS3:FXQP:SUHW:4ASM:M3YC:22BW:GZCO:U5T5
 Docker Root Dir: /var/lib/docker
 Debug Mode: false
 Registry: https://index.docker.io/v1/
 Labels:
 Experimental: true
 Insecure Registries:
  127.0.0.0/8
 Live Restore Enabled: false

Anything else?

No response

Metadata

Metadata

Assignees

No one assigned

    Labels

    Type

    No type

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions