-
Notifications
You must be signed in to change notification settings - Fork 5.3k
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
fix(hash): recreate container on project config content change #11931
base: main
Are you sure you want to change the base?
Conversation
While I understand the intent, I don't like we get the config content added into the service hash. This also only makes sense as the config content is inlined. |
why?
I don't get the idea, time it was created - do you mean config file? or docker-compose.yaml? but docker-compose can refer to external config file |
time container was created, so we can check it needs to be recreated if current config doesn't match |
Some poins:
|
@ndeloof thanks for the details. pushed changes:
Let me know if you have better idea for the label name, because I'm not fully satisfied with my name) |
284468c
to
2aa70c0
Compare
Codecov ReportAttention: Patch coverage is
Additional details and impacted files@@ Coverage Diff @@
## main #11931 +/- ##
==========================================
+ Coverage 49.68% 50.15% +0.47%
==========================================
Files 157 158 +1
Lines 15428 15681 +253
==========================================
+ Hits 7665 7865 +200
- Misses 6985 7014 +29
- Partials 778 802 +24 ☔ View full report in Codecov by Sentry. |
cc14e73
to
309fd59
Compare
pkg/compose/hash.go
Outdated
data = append(data, b.Bytes()...) | ||
} | ||
|
||
return digest.SHA256.FromBytes(data).Encoded(), nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
I'd prefer we have one label per config/secret mount, so it makes it easier to track|debug changes and container being recreated.
Also need to consider config can be mounted from docker host, i.e. file is not available for compose to compute hash, and then must be excluded from label / no label created. createTarForConfig
could return ErrNotFound
and we would ignore it for this specific usage
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
do you mean something like that:
com.docker.compose.service.configs-hash-{configName}={hash}
com.docker.compose.service.configs-hash-{serviceName}={hash}
?
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
indeed, or maybe, to follow the dot-notation style used for labels, com.docker.compose.service.configs.{configName}.hash
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
It seems to me that this will complicate the logic, first you need to generate a hash for each item separately, then you need to go through all labels whose names start with “com.docker.compose.service.configs.” to check if the hash has changed.
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
Doesn't look such a pain to me, as this would allow to trace reason we recreate a container, and make it easier to diagnose potential regressions (this sometimes happened :P)
for c := range service.Configs {
hash := labels["com.docker.compose.configs."+c+".hash"]
expected := ConfigHash(project.Configs[c]
if hash := expected {
log.Debug("container has to be recreated after config %s has been updated", c)
return DIVERGED
}
}
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
@ndeloof, but we don't have a config/service name that we can use to create the label name. I pushed changes to create a hash of the config/secret of each service so it'll be easy to figure out what service's config/secret caused the change
if err != nil { | ||
return nil, err | ||
} | ||
|
||
return b, nil |
There was a problem hiding this comment.
Choose a reason for hiding this comment
The reason will be displayed to describe this comment to others. Learn more.
nit: make it simpler as return b, err
Signed-off-by: Suleiman Dibirov <[email protected]>
This reverts commit 64c37bf. Signed-off-by: Suleiman Dibirov <[email protected]>
…older support Signed-off-by: Suleiman Dibirov <[email protected]>
This issue has been automatically marked as not stale anymore due to the recent activity. |
Signed-off-by: Suleiman Dibirov <[email protected]>
What I did
Fixed
hash.ServiceHash()
to support config content changeRelated issue
#11900