// PullImage invokes 'rkt fetch' to download an aci. // TODO(yifan): Now we only support docker images, this should be changed // once the format of image is landed, see: // // http://issue.k8s.io/7203 // func (r *runtime) PullImage(image kubecontainer.ImageSpec, pullSecrets []api.Secret) error { img := image.Image // TODO(yifan): The credential operation is a copy from dockertools package, // Need to resolve the code duplication. repoToPull, _ := parseImageName(img) keyring, err := credentialprovider.MakeDockerKeyring(pullSecrets, r.dockerKeyring) if err != nil { return err } creds, ok := keyring.Lookup(repoToPull) if !ok { glog.V(1).Infof("Pulling image %s without credentials", img) } // Let's update a json. // TODO(yifan): Find a way to feed this to rkt. if err := r.writeDockerAuthConfig(img, creds); err != nil { return err } if _, err := r.runCommand("fetch", dockerPrefix+img); err != nil { glog.Errorf("Failed to fetch: %v", err) return err } return nil }
func (p dockerPuller) Pull(image string, secrets []api.Secret) error { repoToPull, tag := parseImageName(image) // If no tag was specified, use the default "latest". if len(tag) == 0 { tag = "latest" } opts := docker.PullImageOptions{ Repository: repoToPull, Tag: tag, } keyring, err := credentialprovider.MakeDockerKeyring(secrets, p.keyring) if err != nil { return err } creds, haveCredentials := keyring.Lookup(repoToPull) if !haveCredentials { glog.V(1).Infof("Pulling image %s without credentials", image) err := p.client.PullImage(opts, docker.AuthConfiguration{}) if err == nil { return nil } // Image spec: [<registry>/]<repository>/<image>[:<version] so we count '/' explicitRegistry := (strings.Count(image, "/") == 2) // Hack, look for a private registry, and decorate the error with the lack of // credentials. This is heuristic, and really probably could be done better // by talking to the registry API directly from the kubelet here. if explicitRegistry { return fmt.Errorf("image pull failed for %s, this may be because there are no credentials on this request. details: (%v)", image, err) } return filterHTTPError(err, image) } var pullErrs []error for _, currentCreds := range creds { err := p.client.PullImage(opts, currentCreds) // If there was no error, return success if err == nil { return nil } pullErrs = append(pullErrs, filterHTTPError(err, image)) } return utilerrors.NewAggregate(pullErrs) }