Skip to content

Commit 0056225

Browse files
committed
Revert "fix(hash): recreate container on project config content change"
This reverts commit 64c37bf. Signed-off-by: Suleiman Dibirov <idsulik@gmail.com>
1 parent a84e449 commit 0056225

File tree

6 files changed

+53
-18
lines changed

6 files changed

+53
-18
lines changed

cmd/compose/config.go

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -347,7 +347,7 @@ func runHash(ctx context.Context, dockerCli command.Cli, opts configOptions) err
347347
return err
348348
}
349349

350-
hash, err := compose.ServiceHash(project, s)
350+
hash, err := compose.ServiceHash(s)
351351

352352
if err != nil {
353353
return err

pkg/api/labels.go

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,8 @@ const (
3131
ServiceLabel = "com.docker.compose.service"
3232
// ConfigHashLabel stores configuration hash for a compose service
3333
ConfigHashLabel = "com.docker.compose.config-hash"
34+
// ConfigHashDependenciesLabel stores configuration hash for a compose service dependencies
35+
ConfigHashDependenciesLabel = "com.docker.compose.config-hash-dependencies"
3436
// ContainerNumberLabel stores the container index of a replicated service
3537
ContainerNumberLabel = "com.docker.compose.container-number"
3638
// VolumeLabel allow to track resource related to a compose volume

pkg/compose/convergence.go

Lines changed: 14 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -330,7 +330,20 @@ func (c *convergence) mustRecreate(project *types.Project,, expected types.Servi
330330
if policy == api.RecreateForce {
331331
return true, nil
332332
}
333-
configHash, err := ServiceHash(project, expected)
333+
serviceHash, err := ServiceHash(expected)
334+
if err != nil {
335+
return false, err
336+
}
337+
338+
if actual.Labels[api.ConfigHashLabel] != serviceHash {
339+
return true, nil
340+
}
341+
342+
if actual.Labels[api.ImageDigestLabel] != expected.CustomLabels[api.ImageDigestLabel] {
343+
return true, nil
344+
}
345+
346+
serviceDependenciesHash, err := ServiceDependenciesHash(project, expected)
334347
if err != nil {
335348
return false, err
336349
}

pkg/compose/create.go

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -508,16 +508,23 @@ func parseSecurityOpts(p *types.Project, securityOpts []string) ([]string, bool,
508508
}
509509

510510
func (s *composeService) prepareLabels(labels types.Labels, project *types.Project, service types.ServiceConfig, number int) (map[string]string, error) {
511-
hash, err := ServiceHash(project, service)
511+
serviceHash, err := ServiceHash(service)
512+
if err != nil {
513+
return nil, err
514+
}
515+
516+
serviceDependenciesHash, err := ServiceDependenciesHash(project, service)
512517
if err != nil {
513518
return nil, err
514519
}
515-
labels[api.ConfigHashLabel] = hash
516520

517521
if number > 0 {
518522
// One-off containers are not indexed
519523
labels[api.ContainerNumberLabel] = strconv.Itoa(number)
520524
}
525+
labels[api.ConfigHashLabel] = serviceHash
526+
labels[api.ConfigHashDependenciesLabel] = serviceDependenciesHash
527+
labels[api.ContainerNumberLabel] = strconv.Itoa(number)
521528

522529
var dependencies []string
523530
for s, d := range service.DependsOn {

pkg/compose/hash.go

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,7 @@ import (
2525
)
2626

2727
// ServiceHash computes the configuration hash for a service.
28-
func ServiceHash(project *types.Project, o types.ServiceConfig) (string, error) {
28+
func ServiceHash(o types.ServiceConfig) (string, error) {
2929
// remove the Build config when generating the service hash
3030
o.Build = nil
3131
o.PullPolicy = ""
@@ -40,7 +40,12 @@ func ServiceHash(project *types.Project, o types.ServiceConfig) (string, error)
4040
if err != nil {
4141
return "", err
4242
}
43+
return digest.SHA256.FromBytes(bytes).Encoded(), nil
44+
}
4345

46+
// ServiceDependenciesHash computes the configuration hash for service dependencies.
47+
func ServiceDependenciesHash(project *types.Project, o types.ServiceConfig) (string, error) {
48+
bytes := make([]byte, 0)
4449
for _, serviceConfig := range o.Configs {
4550
projectConfig, ok := project.Configs[serviceConfig.Source]
4651
if !ok {

pkg/compose/hash_test.go

Lines changed: 21 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -24,44 +24,52 @@ import (
2424
)
2525

2626
func TestServiceHashWithAllValuesTheSame(t *testing.T) {
27-
hash1, err := ServiceHash(projectConfig("a", "b", "c", ""), serviceConfig("myContext1", "always", 1))
27+
hash1, err := ServiceHash(serviceConfig("myContext1", "always", 1))
2828
assert.NilError(t, err)
29-
hash2, err := ServiceHash(projectConfig("a", "b", "c", ""), serviceConfig("myContext1", "always", 1))
29+
hash2, err := ServiceHash(serviceConfig("myContext1", "always", 1))
3030
assert.NilError(t, err)
3131
assert.Equal(t, hash1, hash2)
3232
}
3333

3434
func TestServiceHashWithIgnorableValues(t *testing.T) {
35-
hash1, err := ServiceHash(&types.Project{}, serviceConfig("myContext1", "always", 1))
35+
hash1, err := ServiceHash(serviceConfig("myContext1", "always", 1))
3636
assert.NilError(t, err)
37-
hash2, err := ServiceHash(&types.Project{}, serviceConfig("myContext2", "never", 2))
37+
hash2, err := ServiceHash(serviceConfig("myContext2", "never", 2))
3838
assert.NilError(t, err)
3939
assert.Equal(t, hash1, hash2)
4040
}
4141

42-
func TestServiceHashWithChangedConfigContent(t *testing.T) {
43-
hash1, err := ServiceHash(projectConfig("myConfigSource", "a", "", ""), serviceConfig("myContext1", "always", 1))
42+
func TestServiceDependenciesHashWithoutChangesContent(t *testing.T) {
43+
hash1, err := ServiceDependenciesHash(projectConfig("myConfigSource", "a", "", ""), serviceConfig("myContext1", "always", 1))
4444
assert.NilError(t, err)
45-
hash2, err := ServiceHash(projectConfig("myConfigSource", "b", "", ""), serviceConfig("myContext2", "never", 2))
45+
hash2, err := ServiceDependenciesHash(projectConfig("myConfigSource", "a", "", ""), serviceConfig("myContext2", "never", 2))
46+
assert.NilError(t, err)
47+
assert.Assert(t, hash1 == hash2)
48+
}
49+
50+
func TestServiceDependenciesHashWithChangedConfigContent(t *testing.T) {
51+
hash1, err := ServiceDependenciesHash(projectConfig("myConfigSource", "a", "", ""), serviceConfig("myContext1", "always", 1))
52+
assert.NilError(t, err)
53+
hash2, err := ServiceDependenciesHash(projectConfig("myConfigSource", "b", "", ""), serviceConfig("myContext2", "never", 2))
4654
assert.NilError(t, err)
4755
assert.Assert(t, hash1 != hash2)
4856
}
4957

50-
func TestServiceHashWithChangedConfigEnvironment(t *testing.T) {
51-
hash1, err := ServiceHash(projectConfig("myConfigSource", "", "a", ""), serviceConfig("myContext1", "always", 1))
58+
func TestServiceDependenciesHashWithChangedConfigEnvironment(t *testing.T) {
59+
hash1, err := ServiceDependenciesHash(projectConfig("myConfigSource", "", "a", ""), serviceConfig("myContext1", "always", 1))
5260
assert.NilError(t, err)
53-
hash2, err := ServiceHash(projectConfig("myConfigSource", "", "b", ""), serviceConfig("myContext2", "never", 2))
61+
hash2, err := ServiceDependenciesHash(projectConfig("myConfigSource", "", "b", ""), serviceConfig("myContext2", "never", 2))
5462
assert.NilError(t, err)
5563
assert.Assert(t, hash1 != hash2)
5664
}
5765

58-
func TestServiceHashWithChangedConfigFile(t *testing.T) {
59-
hash1, err := ServiceHash(
66+
func TestServiceDependenciesHashWithChangedConfigFile(t *testing.T) {
67+
hash1, err := ServiceDependenciesHash(
6068
projectConfig("myConfigSource", "", "", "./testdata/config1.txt"),
6169
serviceConfig("myContext1", "always", 1),
6270
)
6371
assert.NilError(t, err)
64-
hash2, err := ServiceHash(
72+
hash2, err := ServiceDependenciesHash(
6573
projectConfig("myConfigSource", "", "", "./testdata/config2.txt"),
6674
serviceConfig("myContext2", "never", 2),
6775
)

0 commit comments

Comments
 (0)