func (srv *Server) pullImage(r *registry.Registry, out io.Writer, imgId, endpoint string, token []string, json bool) error { history, err := r.GetRemoteHistory(imgId, endpoint, token) if err != nil { return err } // FIXME: Try to stream the images? // FIXME: Launch the getRemoteImage() in goroutines for _, id := range history { if !srv.runtime.graph.Exists(id) { fmt.Fprintf(out, utils.FormatStatus("Pulling %s metadata", json), id) imgJson, err := r.GetRemoteImageJson(id, endpoint, token) if err != nil { // FIXME: Keep goging in case of error? return err } img, err := NewImgJson(imgJson) if err != nil { return fmt.Errorf("Failed to parse json: %s", err) } // Get the layer fmt.Fprintf(out, utils.FormatStatus("Pulling %s fs layer", json), id) layer, contentLength, err := r.GetRemoteImageLayer(img.Id, endpoint, token) if err != nil { return err } if err := srv.runtime.graph.Register(utils.ProgressReader(layer, contentLength, out, utils.FormatProgress("%v/%v (%v)", json), json), false, img); err != nil { return err } } } return nil }