| package containerd |
| |
| import ( |
| "context" |
| |
| "github.com/containerd/containerd/mount" |
| "github.com/containerd/log" |
| "github.com/docker/docker/container" |
| "github.com/docker/docker/pkg/archive" |
| "github.com/docker/docker/pkg/stringid" |
| ) |
| |
| func (i *ImageService) Changes(ctx context.Context, container *container.Container) ([]archive.Change, error) { |
| snapshotter := i.client.SnapshotService(container.Driver) |
| info, err := snapshotter.Stat(ctx, container.ID) |
| if err != nil { |
| return nil, err |
| } |
| |
| id := stringid.GenerateRandomID() |
| parentViewKey := container.ID + "-parent-view-" + id |
| imageMounts, _ := snapshotter.View(ctx, parentViewKey, info.Parent) |
| |
| defer func() { |
| if err := snapshotter.Remove(ctx, parentViewKey); err != nil { |
| log.G(ctx).WithError(err).Warn("error removing the parent view snapshot") |
| } |
| }() |
| |
| var changes []archive.Change |
| err = i.PerformWithBaseFS(ctx, container, func(containerRoot string) error { |
| return mount.WithReadonlyTempMount(ctx, imageMounts, func(imageRoot string) error { |
| changes, err = archive.ChangesDirs(containerRoot, imageRoot) |
| return err |
| }) |
| }) |
| |
| return changes, err |
| } |