mirror of
https://github.com/moby/moby.git
synced 2022-11-09 12:21:53 -05:00
Do not overwrite container volumes from config
Fixes #819 Use same persistent volume when a container is restarted
This commit is contained in:
parent
c8efd08384
commit
92cbb7cc80
2 changed files with 70 additions and 24 deletions
51
container.go
51
container.go
|
@ -516,8 +516,6 @@ func (container *Container) Start(hostConfig *HostConfig) error {
|
||||||
log.Printf("WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.\n")
|
log.Printf("WARNING: Your kernel does not support swap limit capabilities. Limitation discarded.\n")
|
||||||
container.Config.MemorySwap = -1
|
container.Config.MemorySwap = -1
|
||||||
}
|
}
|
||||||
container.Volumes = make(map[string]string)
|
|
||||||
container.VolumesRW = make(map[string]bool)
|
|
||||||
|
|
||||||
// Create the requested bind mounts
|
// Create the requested bind mounts
|
||||||
binds := make(map[string]BindMap)
|
binds := make(map[string]BindMap)
|
||||||
|
@ -557,30 +555,35 @@ func (container *Container) Start(hostConfig *HostConfig) error {
|
||||||
|
|
||||||
// FIXME: evaluate volumes-from before individual volumes, so that the latter can override the former.
|
// FIXME: evaluate volumes-from before individual volumes, so that the latter can override the former.
|
||||||
// Create the requested volumes volumes
|
// Create the requested volumes volumes
|
||||||
for volPath := range container.Config.Volumes {
|
if container.Volumes == nil || len(container.Volumes) == 0 {
|
||||||
volPath = path.Clean(volPath)
|
container.Volumes = make(map[string]string)
|
||||||
// If an external bind is defined for this volume, use that as a source
|
container.VolumesRW = make(map[string]bool)
|
||||||
if bindMap, exists := binds[volPath]; exists {
|
|
||||||
container.Volumes[volPath] = bindMap.SrcPath
|
for volPath := range container.Config.Volumes {
|
||||||
if strings.ToLower(bindMap.Mode) == "rw" {
|
volPath = path.Clean(volPath)
|
||||||
container.VolumesRW[volPath] = true
|
// If an external bind is defined for this volume, use that as a source
|
||||||
|
if bindMap, exists := binds[volPath]; exists {
|
||||||
|
container.Volumes[volPath] = bindMap.SrcPath
|
||||||
|
if strings.ToLower(bindMap.Mode) == "rw" {
|
||||||
|
container.VolumesRW[volPath] = true
|
||||||
|
}
|
||||||
|
// Otherwise create an directory in $ROOT/volumes/ and use that
|
||||||
|
} else {
|
||||||
|
c, err := container.runtime.volumes.Create(nil, container, "", "", nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
srcPath, err := c.layer()
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
container.Volumes[volPath] = srcPath
|
||||||
|
container.VolumesRW[volPath] = true // RW by default
|
||||||
}
|
}
|
||||||
// Otherwise create an directory in $ROOT/volumes/ and use that
|
// Create the mountpoint
|
||||||
} else {
|
if err := os.MkdirAll(path.Join(container.RootfsPath(), volPath), 0755); err != nil {
|
||||||
c, err := container.runtime.volumes.Create(nil, container, "", "", nil)
|
return nil
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
}
|
||||||
srcPath, err := c.layer()
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
container.Volumes[volPath] = srcPath
|
|
||||||
container.VolumesRW[volPath] = true // RW by default
|
|
||||||
}
|
|
||||||
// Create the mountpoint
|
|
||||||
if err := os.MkdirAll(path.Join(container.RootfsPath(), volPath), 0755); err != nil {
|
|
||||||
return nil
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -1300,3 +1300,46 @@ func TestVolumesFromReadonlyMount(t *testing.T) {
|
||||||
t.Fail()
|
t.Fail()
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Test that restarting a container with a volume does not create a new volume on restart. Regression test for #819.
|
||||||
|
func TestRestartWithVolumes(t *testing.T) {
|
||||||
|
runtime := mkRuntime(t)
|
||||||
|
defer nuke(runtime)
|
||||||
|
|
||||||
|
container, err := NewBuilder(runtime).Create(&Config{
|
||||||
|
Image: GetTestImage(runtime).ID,
|
||||||
|
Cmd: []string{"echo", "-n", "foobar"},
|
||||||
|
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()
|
||||||
|
}
|
||||||
|
// Run the container again to verify the volume path persists
|
||||||
|
_, err = container.Output()
|
||||||
|
if err != nil {
|
||||||
|
t.Fatal(err)
|
||||||
|
}
|
||||||
|
|
||||||
|
actual := container.Volumes["/test"]
|
||||||
|
if expected != actual {
|
||||||
|
t.Fatalf("Expected volume path: %s Actual path: %s", expected, actual)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Add table
Reference in a new issue