Unpack image during import.

Signed-off-by: Lantao Liu <lantaol@google.com>
This commit is contained in:
Lantao Liu 2018-07-26 07:23:48 +00:00
parent a0cfc8c1d2
commit e1a37e8797
3 changed files with 29 additions and 6 deletions

View File

@ -29,6 +29,7 @@ for d in $(find . -type d -a \( -iwholename './pkg*' -o -iwholename './cmd*' \)
--disable=aligncheck \ --disable=aligncheck \
--disable=gotype \ --disable=gotype \
--disable=gas \ --disable=gas \
--disable=gosec \
--cyclo-over=60 \ --cyclo-over=60 \
--dupl-threshold=100 \ --dupl-threshold=100 \
--tests \ --tests \

View File

@ -87,13 +87,33 @@ type imageConfig struct {
img ocispec.Image img ocispec.Image
} }
type importConfig struct {
unpack bool
snapshotter string
}
// ImportOption configures import behavior.
type ImportOption func(*importConfig)
// WithUnpack is used to unpack image after import.
func WithUnpack(snapshotter string) ImportOption {
return func(c *importConfig) {
c.unpack = true
c.snapshotter = snapshotter
}
}
// Import implements Docker Image Spec v1.1. // Import implements Docker Image Spec v1.1.
// An image MUST have `manifest.json`. // An image MUST have `manifest.json`.
// `repositories` file in Docker Image Spec v1.0 is not supported (yet). // `repositories` file in Docker Image Spec v1.0 is not supported (yet).
// Also, the current implementation assumes the implicit file name convention, // Also, the current implementation assumes the implicit file name convention,
// which is not explicitly documented in the spec. (e.g. foobar/layer.tar) // which is not explicitly documented in the spec. (e.g. foobar/layer.tar)
// It returns a group of image references successfully loaded. // It returns a group of image references successfully loaded.
func Import(ctx context.Context, client *containerd.Client, reader io.Reader) (_ []string, retErr error) { func Import(ctx context.Context, client *containerd.Client, reader io.Reader, opts ...ImportOption) (_ []string, retErr error) {
c := &importConfig{}
for _, o := range opts {
o(c)
}
ctx, done, err := client.WithLease(ctx) ctx, done, err := client.WithLease(ctx)
if err != nil { if err != nil {
return nil, err return nil, err
@ -209,6 +229,12 @@ func Import(ctx context.Context, client *containerd.Client, reader io.Reader) (_
Name: ref, Name: ref,
Target: *desc, Target: *desc,
} }
if c.unpack {
img := containerd.NewImage(client, imgrec)
if err := img.Unpack(ctx, c.snapshotter); err != nil {
return refs, errors.Wrapf(err, "unpack image %q", ref)
}
}
if _, err := is.Create(ctx, imgrec); err != nil { if _, err := is.Create(ctx, imgrec); err != nil {
if !errdefs.IsAlreadyExists(err) { if !errdefs.IsAlreadyExists(err) {
return refs, errors.Wrapf(err, "create image ref %+v", imgrec) return refs, errors.Wrapf(err, "create image ref %+v", imgrec)

View File

@ -39,7 +39,7 @@ func (c *criService) LoadImage(ctx context.Context, r *api.LoadImageRequest) (*a
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to open file") return nil, errors.Wrap(err, "failed to open file")
} }
repoTags, err := importer.Import(ctx, c.client, f) repoTags, err := importer.Import(ctx, c.client, f, importer.WithUnpack(c.config.ContainerdConfig.Snapshotter))
if err != nil { if err != nil {
return nil, errors.Wrap(err, "failed to import image") return nil, errors.Wrap(err, "failed to import image")
} }
@ -48,10 +48,6 @@ func (c *criService) LoadImage(ctx context.Context, r *api.LoadImageRequest) (*a
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "failed to get image %q", repoTag) return nil, errors.Wrapf(err, "failed to get image %q", repoTag)
} }
if err := image.Unpack(ctx, c.config.ContainerdConfig.Snapshotter); err != nil {
logrus.WithError(err).Warnf("Failed to unpack image %q", repoTag)
// Do not fail image importing. Unpack will be retried when container creation.
}
info, err := getImageInfo(ctx, image) info, err := getImageInfo(ctx, image)
if err != nil { if err != nil {
return nil, errors.Wrapf(err, "failed to get image %q info", repoTag) return nil, errors.Wrapf(err, "failed to get image %q info", repoTag)