Closed
Description
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