mirror of
https://github.com/containers/podman.git
synced 2025-06-18 15:39:08 +08:00

In Podman 1.6.3, we added support for anonymous volumes - fixing our old, broken support for named volumes that were created with containers. Unfortunately, this reused the database field we used for the old implementation, and toggled volume removal on for `podman run --rm` - so now, we were removing *named* volumes created with older versions of Podman. We can't modify these old volumes in the DB, so the next-safest thing to do is swap to a new field to indicate volumes should be removed. Problem: Volumes created with 1.6.3 and up until this lands, even anonymous volumes, will not be removed. However, this is safer than removing too many volumes, as we were doing before. Fixes #5009 Signed-off-by: Matthew Heon <matthew.heon@pm.me>
129 lines
3.9 KiB
Go
129 lines
3.9 KiB
Go
package libpod
|
|
|
|
import (
|
|
"time"
|
|
|
|
"github.com/containers/libpod/libpod/lock"
|
|
)
|
|
|
|
// Volume is a libpod named volume.
|
|
// Named volumes may be shared by multiple containers, and may be created using
|
|
// more complex options than normal bind mounts. They may be backed by a mounted
|
|
// filesystem on the host.
|
|
type Volume struct {
|
|
config *VolumeConfig
|
|
state *VolumeState
|
|
|
|
valid bool
|
|
runtime *Runtime
|
|
lock lock.Locker
|
|
}
|
|
|
|
// VolumeConfig holds the volume's immutable configuration.
|
|
type VolumeConfig struct {
|
|
// Name of the volume.
|
|
Name string `json:"name"`
|
|
// ID of the volume's lock.
|
|
LockID uint32 `json:"lockID"`
|
|
// Labels for the volume.
|
|
Labels map[string]string `json:"labels"`
|
|
// The volume driver. Empty string or local does not activate a volume
|
|
// driver, all other volumes will.
|
|
Driver string `json:"volumeDriver"`
|
|
// The location the volume is mounted at.
|
|
MountPoint string `json:"mountPoint"`
|
|
// Time the volume was created.
|
|
CreatedTime time.Time `json:"createdAt,omitempty"`
|
|
// Options to pass to the volume driver. For the local driver, this is
|
|
// a list of mount options. For other drivers, they are passed to the
|
|
// volume driver handling the volume.
|
|
Options map[string]string `json:"volumeOptions,omitempty"`
|
|
// Whether this volume is anonymous (will be removed on container exit)
|
|
IsAnon bool `json:"isAnon"`
|
|
// UID the volume will be created as.
|
|
UID int `json:"uid"`
|
|
// GID the volume will be created as.
|
|
GID int `json:"gid"`
|
|
}
|
|
|
|
// VolumeState holds the volume's mutable state.
|
|
// Volumes are not guaranteed to have a state. Only volumes using the Local
|
|
// driver that have mount options set will create a state.
|
|
type VolumeState struct {
|
|
// MountCount is the number of times this volume has been requested to
|
|
// be mounted.
|
|
// It is incremented on mount() and decremented on unmount().
|
|
// On incrementing from 0, the volume will be mounted on the host.
|
|
// On decrementing to 0, the volume will be unmounted on the host.
|
|
MountCount uint `json:"mountCount"`
|
|
// NeedsCopyUp indicates that the next time the volume is mounted into
|
|
// a container, the container will "copy up" the contents of the
|
|
// mountpoint into the volume.
|
|
// This should only be done once. As such, this is set at container
|
|
// create time, then cleared after the copy up is done and never set
|
|
// again.
|
|
NeedsCopyUp bool `json:"notYetMounted,omitempty"`
|
|
}
|
|
|
|
// Name retrieves the volume's name
|
|
func (v *Volume) Name() string {
|
|
return v.config.Name
|
|
}
|
|
|
|
// Driver retrieves the volume's driver.
|
|
func (v *Volume) Driver() string {
|
|
return v.config.Driver
|
|
}
|
|
|
|
// Scope retrieves the volume's scope.
|
|
// Libpod does not implement volume scoping, and this is provided solely for
|
|
// Docker compatibility. It returns only "local".
|
|
func (v *Volume) Scope() string {
|
|
return "local"
|
|
}
|
|
|
|
// Labels returns the volume's labels
|
|
func (v *Volume) Labels() map[string]string {
|
|
labels := make(map[string]string)
|
|
for key, value := range v.config.Labels {
|
|
labels[key] = value
|
|
}
|
|
return labels
|
|
}
|
|
|
|
// MountPoint returns the volume's mountpoint on the host
|
|
func (v *Volume) MountPoint() string {
|
|
return v.config.MountPoint
|
|
}
|
|
|
|
// Options return the volume's options
|
|
func (v *Volume) Options() map[string]string {
|
|
options := make(map[string]string)
|
|
for k, v := range v.config.Options {
|
|
options[k] = v
|
|
}
|
|
return options
|
|
}
|
|
|
|
// Anonymous returns whether this volume is anonymous. Anonymous volumes were
|
|
// created with a container, and will be removed when that container is removed.
|
|
func (v *Volume) Anonymous() bool {
|
|
return v.config.IsAnon
|
|
}
|
|
|
|
// UID returns the UID the volume will be created as.
|
|
func (v *Volume) UID() int {
|
|
return v.config.UID
|
|
}
|
|
|
|
// GID returns the GID the volume will be created as.
|
|
func (v *Volume) GID() int {
|
|
return v.config.GID
|
|
}
|
|
|
|
// CreatedTime returns the time the volume was created at. It was not tracked
|
|
// for some time, so older volumes may not contain one.
|
|
func (v *Volume) CreatedTime() time.Time {
|
|
return v.config.CreatedTime
|
|
}
|