浏览代码

executor: Don't repull image if pinned by digest

If the image reference in the spec uses a digest, and an image with that
digest already exists locally, avoid an unnecessary repull.

Signed-off-by: Aaron Lehmann <aaron.lehmann@docker.com>
Aaron Lehmann 8 年之前
父节点
当前提交
f69e5c18ac
共有 2 个文件被更改,包括 14 次插入0 次删除
  1. 1 0
      daemon/cluster/executor/backend.go
  2. 13 0
      daemon/cluster/executor/container/adapter.go

+ 1 - 0
daemon/cluster/executor/backend.go

@@ -48,4 +48,5 @@ type Backend interface {
 	UpdateAttachment(string, string, string, *network.NetworkingConfig) error
 	WaitForDetachment(context.Context, string, string, string, string) error
 	GetRepository(context.Context, reference.NamedTagged, *types.AuthConfig) (distribution.Repository, bool, error)
+	LookupImage(name string) (*types.ImageInspect, error)
 }

+ 13 - 0
daemon/cluster/executor/container/adapter.go

@@ -16,6 +16,7 @@ import (
 	"github.com/docker/docker/api/types/events"
 	"github.com/docker/docker/api/types/versions"
 	executorpkg "github.com/docker/docker/daemon/cluster/executor"
+	"github.com/docker/docker/reference"
 	"github.com/docker/libnetwork"
 	"github.com/docker/swarmkit/agent/exec"
 	"github.com/docker/swarmkit/api"
@@ -49,6 +50,18 @@ func newContainerAdapter(b executorpkg.Backend, task *api.Task, secrets exec.Sec
 func (c *containerAdapter) pullImage(ctx context.Context) error {
 	spec := c.container.spec()
 
+	// Skip pulling if the image is referenced by digest and already
+	// exists locally.
+	named, err := reference.ParseNamed(spec.Image)
+	if err == nil {
+		if _, ok := named.(reference.Canonical); ok {
+			_, err := c.backend.LookupImage(spec.Image)
+			if err == nil {
+				return nil
+			}
+		}
+	}
+
 	// if the image needs to be pulled, the auth config will be retrieved and updated
 	var encodedAuthConfig string
 	if spec.PullOptions != nil {