diff options
author | umohnani8 <umohnani@redhat.com> | 2018-06-11 15:27:42 -0400 |
---|---|---|
committer | Atomic Bot <atomic-devel@projectatomic.io> | 2018-07-09 19:30:03 +0000 |
commit | 4855998f1cf533b27e48b2ded5541841fe6a3ea6 (patch) | |
tree | 7bb7e276e04f7d235e667bf088e5c87e43a74924 /libpod | |
parent | c7424b69911222c2dc92a41308685f1e6d36fb53 (diff) | |
download | podman-4855998f1cf533b27e48b2ded5541841fe6a3ea6.tar.gz podman-4855998f1cf533b27e48b2ded5541841fe6a3ea6.tar.bz2 podman-4855998f1cf533b27e48b2ded5541841fe6a3ea6.zip |
Add --volumes-from flag to podman run and create
podman now supports --volumes-from flag, which allows users
to add all the volumes an existing container has to a new one.
Signed-off-by: umohnani8 <umohnani@redhat.com>
Closes: #931
Approved by: mheon
Diffstat (limited to 'libpod')
-rw-r--r-- | libpod/container.go | 3 | ||||
-rw-r--r-- | libpod/container_internal.go | 13 | ||||
-rw-r--r-- | libpod/container_internal_linux.go | 2 | ||||
-rw-r--r-- | libpod/options.go | 18 |
4 files changed, 34 insertions, 2 deletions
diff --git a/libpod/container.go b/libpod/container.go index 24a5f93af..9486986ab 100644 --- a/libpod/container.go +++ b/libpod/container.go @@ -313,6 +313,9 @@ type ContainerConfig struct { // ExitCommand is the container's exit command. // This Command will be executed when the container exits ExitCommand []string `json:"exitCommand,omitempty"` + // LocalVolumes are the built-in volumes we get from the --volumes-from flag + // It picks up the built-in volumes of the container used by --volumes-from + LocalVolumes []string } // ContainerStatus returns a string representation for users diff --git a/libpod/container_internal.go b/libpod/container_internal.go index 94cd74c09..eb9b39a02 100644 --- a/libpod/container_internal.go +++ b/libpod/container_internal.go @@ -1108,7 +1108,7 @@ func (c *Container) generateHosts() (string, error) { return c.writeStringToRundir("hosts", hosts) } -func (c *Container) addImageVolumes(ctx context.Context, g *generate.Generator) error { +func (c *Container) addLocalVolumes(ctx context.Context, g *generate.Generator) error { mountPoint := c.state.Mountpoint if !c.state.Mounted { return errors.Wrapf(ErrInternal, "container is not mounted") @@ -1121,6 +1121,17 @@ func (c *Container) addImageVolumes(ctx context.Context, g *generate.Generator) if err != nil { return err } + // Add the built-in volumes of the container passed in to --volumes-from + for _, vol := range c.config.LocalVolumes { + if imageData.ContainerConfig.Volumes == nil { + imageData.ContainerConfig.Volumes = map[string]struct{}{ + vol: {}, + } + } else { + imageData.ContainerConfig.Volumes[vol] = struct{}{} + } + } + for k := range imageData.ContainerConfig.Volumes { mount := spec.Mount{ Destination: k, diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go index 0dc02d117..9ad825458 100644 --- a/libpod/container_internal_linux.go +++ b/libpod/container_internal_linux.go @@ -127,7 +127,7 @@ func (c *Container) generateSpec(ctx context.Context) (*spec.Spec, error) { // Bind builtin image volumes if c.config.Rootfs == "" && c.config.ImageVolumes { - if err := c.addImageVolumes(ctx, &g); err != nil { + if err := c.addLocalVolumes(ctx, &g); err != nil { return nil, errors.Wrapf(err, "error mounting image volumes") } } diff --git a/libpod/options.go b/libpod/options.go index 9f07db7ed..c02bd4336 100644 --- a/libpod/options.go +++ b/libpod/options.go @@ -885,6 +885,24 @@ func WithUserVolumes(volumes []string) CtrCreateOption { } } +// WithLocalVolumes sets the built-in volumes of the container retrieved +// from a container passed in to the --volumes-from flag. +// This stores the built-in volume information in the ContainerConfig so we can +// add them when creating the container. +func WithLocalVolumes(volumes []string) CtrCreateOption { + return func(ctr *Container) error { + if ctr.valid { + return ErrCtrFinalized + } + + if volumes != nil { + ctr.config.LocalVolumes = append(ctr.config.LocalVolumes, volumes...) + } + + return nil + } +} + // WithEntrypoint sets the entrypoint of the container. // This is not used to change the container's spec, but will instead be used // during commit to populate the entrypoint of the new image. |