| 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 | |
| } |