Add support for 'image' volume driver

We added the concept of image volumes in 2.2.0, to support
inspecting an image from within a container. However, this is a
strictly read-only mount, with no modification allowed.

By contrast, the new `image` volume driver creates a c/storage
container as its underlying storage, so we have a read/write
layer. This, in and of itself, is not especially interesting, but
what it will enable in the future is. If we add a new command to
allow these image volumes to be committed, we can now distribute
volumes - and changes to them - via a standard OCI image registry
(which is rather new and quite exciting).

Future work in this area:
- Add support for `podman volume push` (commit volume changes and
  push resulting image to OCI registry).
- Add support for `podman volume pull` (currently, we require
  that the image a volume is created from be already pulled; it
  would be simpler if we had a dedicated command that did the
  pull and made a volume from it)
- Add support for scratch images (make an empty image on demand
  to use as the base of the volume)
- Add UOR support to `podman volume push` and
  `podman volume pull` to enable both with non-image volume
  drivers

Signed-off-by: Matthew Heon <matthew.heon@pm.me>
This commit is contained in:
Matthew Heon
2022-09-16 15:00:37 -04:00
committed by Matthew Heon
parent 08993516a9
commit fc6dcd12b3
18 changed files with 289 additions and 9 deletions

View File

@ -63,6 +63,15 @@ func (v *Volume) mount() error {
return err
}
v.state.MountCount++
v.state.MountPoint = mountPoint
return v.save()
} else if v.config.Driver == define.VolumeDriverImage {
mountPoint, err := v.runtime.storageService.MountContainerImage(v.config.StorageID)
if err != nil {
return fmt.Errorf("mounting volume %s image failed: %w", v.Name(), err)
}
v.state.MountCount++
v.state.MountPoint = mountPoint
return v.save()
@ -159,6 +168,13 @@ func (v *Volume) unmount(force bool) error {
return err
}
v.state.MountPoint = ""
return v.save()
} else if v.config.Driver == define.VolumeDriverImage {
if _, err := v.runtime.storageService.UnmountContainerImage(v.config.StorageID, force); err != nil {
return fmt.Errorf("unmounting volume %s image: %w", v.Name(), err)
}
v.state.MountPoint = ""
return v.save()
}