Rolling restart (#619)

* implement rolling restart functionality

bouncing each image individually can ensure that a group of docker
containers launched with docker-compose can stay 100% up during deploy.

* move rolling restart into a function

* honor params.Cleanup

Co-authored-by: Simon Aronsson <simme@arcticbit.se>
This commit is contained in:
Ben Osheroff 2020-08-21 13:35:46 -07:00 committed by GitHub
parent 6a18ee911e
commit c56e0a95a7
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
5 changed files with 53 additions and 9 deletions

View file

@ -52,15 +52,33 @@ func Update(client container.Client, params types.UpdateParams) error {
return nil
}
stopContainersInReversedOrder(containers, client, params)
restartContainersInSortedOrder(containers, client, params)
if params.RollingRestart {
performRollingRestart(containers, client, params)
} else {
stopContainersInReversedOrder(containers, client, params)
restartContainersInSortedOrder(containers, client, params)
}
if params.LifecycleHooks {
lifecycle.ExecutePostChecks(client, params)
}
return nil
}
func performRollingRestart(containers []container.Container, client container.Client, params types.UpdateParams) {
cleanupImageIDs := make(map[string]bool)
for i := len(containers) - 1; i >= 0; i-- {
if containers[i].Stale {
stopStaleContainer(containers[i], client, params)
restartStaleContainer(containers[i], client, params)
}
}
if params.Cleanup {
cleanupImages(client, cleanupImageIDs)
}
}
func stopContainersInReversedOrder(containers []container.Container, client container.Client, params types.UpdateParams) {
for i := len(containers) - 1; i >= 0; i-- {
stopStaleContainer(containers[i], client, params)
@ -99,11 +117,16 @@ func restartContainersInSortedOrder(containers []container.Container, client con
restartStaleContainer(staleContainer, client, params)
imageIDs[staleContainer.ImageID()] = true
}
if params.Cleanup {
for imageID := range imageIDs {
if err := client.RemoveImageByID(imageID); err != nil {
log.Error(err)
}
cleanupImages(client, imageIDs)
}
}
func cleanupImages(client container.Client, imageIDs map[string]bool) {
for imageID := range imageIDs {
if err := client.RemoveImageByID(imageID); err != nil {
log.Error(err)
}
}
}

View file

@ -123,6 +123,12 @@ func RegisterSystemFlags(rootCmd *cobra.Command) {
viper.GetBool("WATCHTOWER_LIFECYCLE_HOOKS"),
"Enable the execution of commands triggered by pre- and post-update lifecycle hooks")
flags.BoolP(
"rolling-restart",
"",
viper.GetBool("WATCHTOWER_ROLLING_RESTART"),
"Restart containers one at a time")
flags.BoolP(
"http-api",
"",