diff --git a/container.go b/container.go index 4ea44f2705..84b2efd526 100644 --- a/container.go +++ b/container.go @@ -146,7 +146,9 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, flVolumes := NewPathOpts() cmd.Var(flVolumes, "v", "Bind mount a volume (e.g. from the host: -v /host:/container, from docker: -v /container)") - flVolumesFrom := cmd.String("volumes-from", "", "Mount volumes from the specified container") + var flVolumesFrom ListOpts + cmd.Var(&flVolumesFrom, "volumes-from", "Mount volumes from the specified container") + flEntrypoint := cmd.String("entrypoint", "", "Overwrite the default entrypoint of the image") var flLxcOpts ListOpts @@ -231,7 +233,7 @@ func ParseRun(args []string, capabilities *Capabilities) (*Config, *HostConfig, Dns: flDns, Image: image, Volumes: flVolumes, - VolumesFrom: *flVolumesFrom, + VolumesFrom: strings.Join(flVolumesFrom, ","), Entrypoint: entrypoint, Privileged: *flPrivileged, WorkingDir: *flWorkingDir, @@ -639,21 +641,25 @@ func (container *Container) Start(hostConfig *HostConfig) error { // Apply volumes from another container if requested if container.Config.VolumesFrom != "" { - c := container.runtime.Get(container.Config.VolumesFrom) - if c == nil { - return fmt.Errorf("Container %s not found. Impossible to mount its volumes", container.ID) - } - for volPath, id := range c.Volumes { - if _, exists := container.Volumes[volPath]; exists { - continue + volumes := strings.Split(container.Config.VolumesFrom, ",") + for _, v := range volumes { + c := container.runtime.Get(v) + if c == nil { + return fmt.Errorf("Container %s not found. Impossible to mount its volumes", container.ID) } - if err := os.MkdirAll(path.Join(container.RootfsPath(), volPath), 0755); err != nil { - return err - } - container.Volumes[volPath] = id - if isRW, exists := c.VolumesRW[volPath]; exists { - container.VolumesRW[volPath] = isRW + for volPath, id := range c.Volumes { + if _, exists := container.Volumes[volPath]; exists { + continue + } + if err := os.MkdirAll(path.Join(container.RootfsPath(), volPath), 0755); err != nil { + return err + } + container.Volumes[volPath] = id + if isRW, exists := c.VolumesRW[volPath]; exists { + container.VolumesRW[volPath] = isRW + } } + } } diff --git a/container_test.go b/container_test.go index 41940242f9..2a079442be 100644 --- a/container_test.go +++ b/container_test.go @@ -1549,3 +1549,80 @@ func TestPrivilegedCannotMount(t *testing.T) { t.Fatal("Could mount into secure container") } } + +func TestMultipleVolumesFrom(t *testing.T) { + runtime := mkRuntime(t) + defer nuke(runtime) + + container, err := runtime.Create(&Config{ + Image: GetTestImage(runtime).ID, + Cmd: []string{"sh", "-c", "echo -n bar > /test/foo"}, + Volumes: map[string]struct{}{"/test": {}}, + }, + ) + if err != nil { + t.Fatal(err) + } + defer runtime.Destroy(container) + + for key := range container.Config.Volumes { + if key != "/test" { + t.Fail() + } + } + + _, err = container.Output() + if err != nil { + t.Fatal(err) + } + + expected := container.Volumes["/test"] + if expected == "" { + t.Fail() + } + + container2, err := runtime.Create( + &Config{ + Image: GetTestImage(runtime).ID, + Cmd: []string{"sh", "-c", "echo -n bar > /other/foo"}, + Volumes: map[string]struct{}{"/other": {}}, + }, + ) + if err != nil { + t.Fatal(err) + } + defer runtime.Destroy(container2) + + for key := range container2.Config.Volumes { + if key != "/other" { + t.FailNow() + } + } + if _, err := container2.Output(); err != nil { + t.Fatal(err) + } + + container3, err := runtime.Create( + &Config{ + Image: GetTestImage(runtime).ID, + Cmd: []string{"/bin/echo", "-n", "foobar"}, + VolumesFrom: strings.Join([]string{container.ID, container2.ID}, ","), + }) + + if err != nil { + t.Fatal(err) + } + defer runtime.Destroy(container3) + + if _, err := container3.Output(); err != nil { + t.Fatal(err) + } + + t.Log(container3.Volumes) + if container3.Volumes["/test"] != container.Volumes["/test"] { + t.Fail() + } + if container3.Volumes["/other"] != container2.Volumes["/other"] { + t.Fail() + } +}