| package containerd |
| |
| import ( |
| "context" |
| "fmt" |
| "os" |
| |
| "github.com/containerd/containerd/mount" |
| "github.com/docker/docker/container" |
| "github.com/sirupsen/logrus" |
| ) |
| |
| // Mount mounts the container filesystem in a temporary location, use defer imageService.Unmount |
| // to unmount the filesystem when calling this |
| func (i *ImageService) Mount(ctx context.Context, container *container.Container) error { |
| snapshotter := i.client.SnapshotService(container.Driver) |
| mounts, err := snapshotter.Mounts(ctx, container.ID) |
| if err != nil { |
| return err |
| } |
| |
| // The temporary location will be under /var/lib/docker/... because |
| // we set the `TMPDIR` |
| root, err := os.MkdirTemp("", fmt.Sprintf("%s_rootfs-mount", container.ID)) |
| if err != nil { |
| return fmt.Errorf("failed to create temp dir: %w", err) |
| } |
| |
| if err := mount.All(mounts, root); err != nil { |
| return fmt.Errorf("failed to mount %s: %w", root, err) |
| } |
| |
| container.BaseFS = root |
| return nil |
| } |
| |
| // Unmount unmounts the container base filesystem |
| func (i *ImageService) Unmount(ctx context.Context, container *container.Container) error { |
| root := container.BaseFS |
| |
| if err := mount.UnmountAll(root, 0); err != nil { |
| return fmt.Errorf("failed to unmount %s: %w", root, err) |
| } |
| |
| if err := os.Remove(root); err != nil { |
| logrus.WithError(err).WithField("dir", root).Error("failed to remove mount temp dir") |
| } |
| |
| container.BaseFS = "" |
| |
| return nil |
| } |