github.com/bdwilliams/libcompose@v0.3.1-0.20160826154243-d81a9bdacff0/docker/image/image.go (about) 1 package image 2 3 import ( 4 "encoding/base64" 5 "encoding/json" 6 "fmt" 7 "io" 8 "os" 9 10 "golang.org/x/net/context" 11 12 "github.com/Sirupsen/logrus" 13 "github.com/docker/docker/pkg/jsonmessage" 14 "github.com/docker/docker/pkg/term" 15 "github.com/docker/docker/reference" 16 "github.com/docker/docker/registry" 17 "github.com/docker/engine-api/client" 18 "github.com/docker/engine-api/types" 19 "github.com/docker/libcompose/docker/auth" 20 ) 21 22 // InspectImage inspect the specified image (can be a name, an id or a digest) 23 // with the specified client. 24 func InspectImage(ctx context.Context, client client.ImageAPIClient, image string) (types.ImageInspect, error) { 25 imageInspect, _, err := client.ImageInspectWithRaw(ctx, image, false) 26 return imageInspect, err 27 } 28 29 // RemoveImage removes the specified image (can be a name, an id or a digest) 30 // from the daemon store with the specified client. 31 func RemoveImage(ctx context.Context, client client.ImageAPIClient, image string) error { 32 _, err := client.ImageRemove(ctx, image, types.ImageRemoveOptions{}) 33 return err 34 } 35 36 // PullImage pulls the specified image (can be a name, an id or a digest) 37 // to the daemon store with the specified client. 38 func PullImage(ctx context.Context, client client.ImageAPIClient, serviceName string, authLookup auth.Lookup, image string) error { 39 fmt.Fprintf(os.Stderr, "Pulling %s (%s)...\n", serviceName, image) 40 distributionRef, err := reference.ParseNamed(image) 41 if err != nil { 42 return err 43 } 44 45 repoInfo, err := registry.ParseRepositoryInfo(distributionRef) 46 if err != nil { 47 return err 48 } 49 50 authConfig := authLookup.Lookup(repoInfo) 51 52 // Use ConfigFile.SaveToWriter to not re-define encodeAuthToBase64 53 encodedAuth, err := encodeAuthToBase64(authConfig) 54 if err != nil { 55 return err 56 } 57 58 options := types.ImagePullOptions{ 59 RegistryAuth: encodedAuth, 60 } 61 responseBody, err := client.ImagePull(ctx, distributionRef.String(), options) 62 if err != nil { 63 logrus.Errorf("Failed to pull image %s: %v", image, err) 64 return err 65 } 66 defer responseBody.Close() 67 68 var writeBuff io.Writer = os.Stderr 69 70 outFd, isTerminalOut := term.GetFdInfo(os.Stderr) 71 72 err = jsonmessage.DisplayJSONMessagesStream(responseBody, writeBuff, outFd, isTerminalOut, nil) 73 if err != nil { 74 if jerr, ok := err.(*jsonmessage.JSONError); ok { 75 // If no error code is set, default to 1 76 if jerr.Code == 0 { 77 jerr.Code = 1 78 } 79 fmt.Fprintf(os.Stderr, "%s", writeBuff) 80 return fmt.Errorf("Status: %s, Code: %d", jerr.Message, jerr.Code) 81 } 82 } 83 return err 84 } 85 86 // encodeAuthToBase64 serializes the auth configuration as JSON base64 payload 87 func encodeAuthToBase64(authConfig types.AuthConfig) (string, error) { 88 buf, err := json.Marshal(authConfig) 89 if err != nil { 90 return "", err 91 } 92 return base64.URLEncoding.EncodeToString(buf), nil 93 }