Skip to content

Commit

Permalink
Skip updating containers where no local image info can be retrieved (#…
Browse files Browse the repository at this point in the history
…612)

* Revert "Image of running container no longer needed locally (#571)"

This reverts commit 6da66fb.

* Update client.go

* fix: skip updating when no image info can be retrieved

This will allow watchtower to continue even though the image info for a
container cannot be retrieved. If this happens one warning will be emitted
and the container will be skipped, unless NoRestart or OnlyMonitor is supplied
  • Loading branch information
piksel authored Aug 18, 2020
1 parent cde4389 commit 5efb249
Show file tree
Hide file tree
Showing 3 changed files with 22 additions and 10 deletions.
19 changes: 11 additions & 8 deletions internal/actions/update.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,7 @@
package actions

import (
"errors"
"github.com/containrrr/watchtower/internal/util"
"github.com/containrrr/watchtower/pkg/container"
"github.com/containrrr/watchtower/pkg/lifecycle"
Expand All @@ -25,11 +26,13 @@ func Update(client container.Client, params types.UpdateParams) error {
return err
}

for i, container := range containers {
stale, err := client.IsContainerStale(container)
for i, targetContainer := range containers {
stale, err := client.IsContainerStale(targetContainer)
if stale && !params.NoRestart && !params.MonitorOnly && !targetContainer.HasImageInfo() {
err = errors.New("no available image info")
}
if err != nil {
log.Infof("Unable to update container %s. Proceeding to next.", containers[i].Name())
log.Debug(err)
log.Infof("Unable to update container %q: %v. Proceeding to next.", containers[i].Name(), err)
stale = false
}
containers[i].Stale = stale
Expand Down Expand Up @@ -89,12 +92,12 @@ func stopStaleContainer(container container.Container, client container.Client,
func restartContainersInSortedOrder(containers []container.Container, client container.Client, params types.UpdateParams) {
imageIDs := make(map[string]bool)

for _, container := range containers {
if !container.Stale {
for _, staleContainer := range containers {
if !staleContainer.Stale {
continue
}
restartStaleContainer(container, client, params)
imageIDs[container.ImageID()] = true
restartStaleContainer(staleContainer, client, params)
imageIDs[staleContainer.ImageID()] = true
}
if params.Cleanup {
for imageID := range imageIDs {
Expand Down
8 changes: 6 additions & 2 deletions pkg/container/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -119,8 +119,12 @@ func (client dockerClient) GetContainer(containerID string) (Container, error) {
return Container{}, err
}

container := Container{containerInfo: &containerInfo}
return container, nil
imageInfo, _, err := client.api.ImageInspectWithRaw(bg, containerInfo.Image)
if err != nil {
log.Warnf("Failed to retrieve container image info: %v", err)
}

return Container{containerInfo: &containerInfo, imageInfo: &imageInfo}, nil
}

func (client dockerClient) StopContainer(c Container, timeout time.Duration) error {
Expand Down
5 changes: 5 additions & 0 deletions pkg/container/container.go
Original file line number Diff line number Diff line change
Expand Up @@ -221,3 +221,8 @@ func (c Container) hostConfig() *dockercontainer.HostConfig {

return hostConfig
}

// HasImageInfo returns whether image information could be retrieved for the container
func (c Container) HasImageInfo() bool {
return c.imageInfo != nil
}

0 comments on commit 5efb249

Please sign in to comment.