| package client |
| |
| import ( |
| "context" |
| "io" |
| "net/url" |
| |
| "github.com/distribution/reference" |
| ) |
| |
| // ImageImportResult holds the response body returned by the daemon for image import. |
| type ImageImportResult interface { |
| io.ReadCloser |
| } |
| |
| // ImageImport creates a new image based on the source options. It returns the |
| // JSON content in the [ImageImportResult]. |
| // |
| // The underlying [io.ReadCloser] is automatically closed if the context is canceled, |
| func (cli *Client) ImageImport(ctx context.Context, source ImageImportSource, ref string, options ImageImportOptions) (ImageImportResult, error) { |
| if ref != "" { |
| // Check if the given image name can be resolved |
| if _, err := reference.ParseNormalizedNamed(ref); err != nil { |
| return nil, err |
| } |
| } |
| |
| query := url.Values{} |
| if source.SourceName != "" { |
| query.Set("fromSrc", source.SourceName) |
| } |
| if ref != "" { |
| query.Set("repo", ref) |
| } |
| if options.Tag != "" { |
| query.Set("tag", options.Tag) |
| } |
| if options.Message != "" { |
| query.Set("message", options.Message) |
| } |
| if p := formatPlatform(options.Platform); p != "unknown" { |
| // TODO(thaJeztah): would we ever support mutiple platforms here? (would require multiple rootfs tars as well?) |
| query.Set("platform", p) |
| } |
| for _, change := range options.Changes { |
| query.Add("changes", change) |
| } |
| |
| resp, err := cli.postRaw(ctx, "/images/create", query, source.Source, nil) |
| if err != nil { |
| return nil, err |
| } |
| return &imageImportResult{ |
| ReadCloser: newCancelReadCloser(ctx, resp.Body), |
| }, nil |
| } |
| |
| // ImageImportResult holds the response body returned by the daemon for image import. |
| type imageImportResult struct { |
| io.ReadCloser |
| } |
| |
| var ( |
| _ io.ReadCloser = (*imageImportResult)(nil) |
| _ ImageImportResult = (*imageImportResult)(nil) |
| ) |