| package client |
| |
| import ( |
| "context" |
| "io" |
| "net/url" |
| ) |
| |
| type ImageSaveResult interface { |
| io.ReadCloser |
| } |
| |
| // ImageSave retrieves one or more images from the docker host as an |
| // [ImageSaveResult]. Callers should close the reader, but the underlying |
| // [io.ReadCloser] is automatically closed if the context is canceled, |
| // |
| // Platforms is an optional parameter that specifies the platforms to save |
| // from the image. Passing a platform only has an effect if the input image |
| // is a multi-platform image. |
| func (cli *Client) ImageSave(ctx context.Context, imageIDs []string, saveOpts ...ImageSaveOption) (ImageSaveResult, error) { |
| var opts imageSaveOpts |
| for _, opt := range saveOpts { |
| if err := opt.Apply(&opts); err != nil { |
| return nil, err |
| } |
| } |
| |
| query := url.Values{ |
| "names": imageIDs, |
| } |
| |
| if len(opts.apiOptions.Platforms) > 0 { |
| if err := cli.requiresVersion(ctx, "1.48", "platform"); err != nil { |
| return nil, err |
| } |
| p, err := encodePlatforms(opts.apiOptions.Platforms...) |
| if err != nil { |
| return nil, err |
| } |
| query["platform"] = p |
| } |
| |
| resp, err := cli.get(ctx, "/images/get", query, nil) |
| if err != nil { |
| return nil, err |
| } |
| return &imageSaveResult{ |
| ReadCloser: newCancelReadCloser(ctx, resp.Body), |
| }, nil |
| } |
| |
| type imageSaveResult struct { |
| io.ReadCloser |
| } |
| |
| var ( |
| _ io.ReadCloser = (*imageSaveResult)(nil) |
| _ ImageSaveResult = (*imageSaveResult)(nil) |
| ) |