mirror of https://github.com/docker/docs.git
Decouple daemon and container to manage volumes.
Signed-off-by: David Calavera <david.calavera@gmail.com>
This commit is contained in:
parent
c1c42db060
commit
2c72015ce3
|
@ -7,7 +7,6 @@ import (
|
||||||
"io"
|
"io"
|
||||||
"os"
|
"os"
|
||||||
"path/filepath"
|
"path/filepath"
|
||||||
"strings"
|
|
||||||
"sync"
|
"sync"
|
||||||
"syscall"
|
"syscall"
|
||||||
"time"
|
"time"
|
||||||
|
@ -31,7 +30,6 @@ import (
|
||||||
"github.com/docker/docker/pkg/system"
|
"github.com/docker/docker/pkg/system"
|
||||||
"github.com/docker/docker/runconfig"
|
"github.com/docker/docker/runconfig"
|
||||||
"github.com/docker/docker/volume"
|
"github.com/docker/docker/volume"
|
||||||
"github.com/docker/docker/volume/store"
|
|
||||||
)
|
)
|
||||||
|
|
||||||
var (
|
var (
|
||||||
|
@ -667,44 +665,6 @@ func (container *Container) mountVolumes() error {
|
||||||
return nil
|
return nil
|
||||||
}
|
}
|
||||||
|
|
||||||
func (container *Container) prepareMountPoints() error {
|
|
||||||
for _, config := range container.MountPoints {
|
|
||||||
if len(config.Driver) > 0 {
|
|
||||||
v, err := container.daemon.createVolume(config.Name, config.Driver, nil)
|
|
||||||
if err != nil {
|
|
||||||
return err
|
|
||||||
}
|
|
||||||
config.Volume = v
|
|
||||||
}
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (container *Container) removeMountPoints(rm bool) error {
|
|
||||||
var rmErrors []string
|
|
||||||
for _, m := range container.MountPoints {
|
|
||||||
if m.Volume == nil {
|
|
||||||
continue
|
|
||||||
}
|
|
||||||
container.daemon.volumes.Decrement(m.Volume)
|
|
||||||
if rm {
|
|
||||||
err := container.daemon.volumes.Remove(m.Volume)
|
|
||||||
// ErrVolumeInUse is ignored because having this
|
|
||||||
// volume being referenced by other container is
|
|
||||||
// not an error, but an implementation detail.
|
|
||||||
// This prevents docker from logging "ERROR: Volume in use"
|
|
||||||
// where there is another container using the volume.
|
|
||||||
if err != nil && err != store.ErrVolumeInUse {
|
|
||||||
rmErrors = append(rmErrors, err.Error())
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
if len(rmErrors) > 0 {
|
|
||||||
return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
|
|
||||||
}
|
|
||||||
return nil
|
|
||||||
}
|
|
||||||
|
|
||||||
func (container *Container) unmountVolumes(forceSyscall bool) error {
|
func (container *Container) unmountVolumes(forceSyscall bool) error {
|
||||||
var (
|
var (
|
||||||
volumeMounts []volume.MountPoint
|
volumeMounts []volume.MountPoint
|
||||||
|
|
|
@ -109,7 +109,7 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *Container, re
|
||||||
}
|
}
|
||||||
defer func() {
|
defer func() {
|
||||||
if retErr != nil {
|
if retErr != nil {
|
||||||
if err := container.removeMountPoints(true); err != nil {
|
if err := daemon.removeMountPoints(container, true); err != nil {
|
||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
|
@ -246,7 +246,7 @@ func (daemon *Daemon) Register(container *Container) error {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := container.prepareMountPoints(); err != nil {
|
if err := daemon.prepareMountPoints(container); err != nil {
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -58,7 +58,7 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error
|
||||||
return err
|
return err
|
||||||
}
|
}
|
||||||
|
|
||||||
if err := container.removeMountPoints(config.RemoveVolume); err != nil {
|
if err := daemon.removeMountPoints(container, config.RemoveVolume); err != nil {
|
||||||
logrus.Error(err)
|
logrus.Error(err)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -0,0 +1,46 @@
|
||||||
|
package daemon
|
||||||
|
|
||||||
|
import (
|
||||||
|
"strings"
|
||||||
|
|
||||||
|
derr "github.com/docker/docker/errors"
|
||||||
|
"github.com/docker/docker/volume/store"
|
||||||
|
)
|
||||||
|
|
||||||
|
func (daemon *Daemon) prepareMountPoints(container *Container) error {
|
||||||
|
for _, config := range container.MountPoints {
|
||||||
|
if len(config.Driver) > 0 {
|
||||||
|
v, err := daemon.createVolume(config.Name, config.Driver, nil)
|
||||||
|
if err != nil {
|
||||||
|
return err
|
||||||
|
}
|
||||||
|
config.Volume = v
|
||||||
|
}
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
||||||
|
|
||||||
|
func (daemon *Daemon) removeMountPoints(container *Container, rm bool) error {
|
||||||
|
var rmErrors []string
|
||||||
|
for _, m := range container.MountPoints {
|
||||||
|
if m.Volume == nil {
|
||||||
|
continue
|
||||||
|
}
|
||||||
|
container.daemon.volumes.Decrement(m.Volume)
|
||||||
|
if rm {
|
||||||
|
err := daemon.volumes.Remove(m.Volume)
|
||||||
|
// ErrVolumeInUse is ignored because having this
|
||||||
|
// volume being referenced by other container is
|
||||||
|
// not an error, but an implementation detail.
|
||||||
|
// This prevents docker from logging "ERROR: Volume in use"
|
||||||
|
// where there is another container using the volume.
|
||||||
|
if err != nil && err != store.ErrVolumeInUse {
|
||||||
|
rmErrors = append(rmErrors, err.Error())
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
if len(rmErrors) > 0 {
|
||||||
|
return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
|
||||||
|
}
|
||||||
|
return nil
|
||||||
|
}
|
Loading…
Reference in New Issue