Skip to content

Commit

Permalink
Log based on registry known-support - reduce noise on notifications (#…
Browse files Browse the repository at this point in the history
…716)

Log based on registry known-poor support of HEAD in checking container
manifest.

Some private registries do not support HEAD (E.G. GitLab Container Registry).
With the current config, this log message is causing a notification to be
sent for each container hosted in a registry lacking HEAD support.

log.Debug or log.Warning for failed HTTP HEAD-check based on registry hostname
where HEAD-check is known to fail.

For Docker Hub, a failed HEAD leading to a "regular pull" may count against a
user's call-quota whereas other registry implementations do not support HEAD,
or whose container manifest may be in a different location.
  • Loading branch information
tkalus authored Dec 22, 2020
1 parent 8b81fbd commit 5983d58
Show file tree
Hide file tree
Showing 2 changed files with 31 additions and 1 deletion.
6 changes: 5 additions & 1 deletion pkg/container/client.go
Original file line number Diff line number Diff line change
Expand Up @@ -295,7 +295,11 @@ func (client dockerClient) PullImage(ctx context.Context, container Container) e
log.WithFields(fields).Debugf("Checking if pull is needed")

if match, err := digest.CompareDigest(container, opts.RegistryAuth); err != nil {
log.Info("Could not do a head request, falling back to regular pull.")
if registry.WarnOnAPIConsumption(container) {
log.WithFields(fields).Warning("Could not do a head request, falling back to regular pull.")
} else {
log.Debug("Could not do a head request, falling back to regular pull.")
}
log.Debugf("Reason: %s", err.Error())
} else if match {
log.Debug("No pull needed. Skipping image.")
Expand Down
26 changes: 26 additions & 0 deletions pkg/registry/registry.go
Original file line number Diff line number Diff line change
@@ -1,6 +1,9 @@
package registry

import (
"github.com/containrrr/watchtower/pkg/registry/helpers"
watchtowerTypes "github.com/containrrr/watchtower/pkg/types"
ref "github.com/docker/distribution/reference"
"github.com/docker/docker/api/types"
log "github.com/sirupsen/logrus"
)
Expand Down Expand Up @@ -31,3 +34,26 @@ func DefaultAuthHandler() (string, error) {
log.Debug("Authentication request was rejected. Trying again without authentication")
return "", nil
}

// WarnOnAPIConsumption will return true if the registry is known-expected
// to respond well to HTTP HEAD in checking the container digest -- or if there
// are problems parsing the container hostname.
// Will return false if behavior for container is unknown.
func WarnOnAPIConsumption(container watchtowerTypes.Container) bool {

normalizedName, err := ref.ParseNormalizedNamed(container.ImageName())
if err != nil {
return true
}

containerHost, err := helpers.NormalizeRegistry(normalizedName.String())
if err != nil {
return true
}

if containerHost == "index.docker.io" || containerHost == "ghcr.io" {
return true
}

return false
}

0 comments on commit 5983d58

Please sign in to comment.