diff --git a/daemon/container.go b/daemon/container.go index e9c14c964e..9955b2123b 100644 --- a/daemon/container.go +++ b/daemon/container.go @@ -7,7 +7,6 @@ import ( "io" "os" "path/filepath" - "strings" "sync" "syscall" "time" @@ -31,7 +30,6 @@ import ( "github.com/docker/docker/pkg/system" "github.com/docker/docker/runconfig" "github.com/docker/docker/volume" - "github.com/docker/docker/volume/store" ) var ( @@ -667,44 +665,6 @@ func (container *Container) mountVolumes() error { 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 { var ( volumeMounts []volume.MountPoint diff --git a/daemon/create.go b/daemon/create.go index 584d452f71..75fa775c53 100644 --- a/daemon/create.go +++ b/daemon/create.go @@ -109,7 +109,7 @@ func (daemon *Daemon) create(params *ContainerCreateConfig) (retC *Container, re } defer func() { if retErr != nil { - if err := container.removeMountPoints(true); err != nil { + if err := daemon.removeMountPoints(container, true); err != nil { logrus.Error(err) } } diff --git a/daemon/daemon.go b/daemon/daemon.go index 78e06d74da..3f17027095 100644 --- a/daemon/daemon.go +++ b/daemon/daemon.go @@ -246,7 +246,7 @@ func (daemon *Daemon) Register(container *Container) error { return err } - if err := container.prepareMountPoints(); err != nil { + if err := daemon.prepareMountPoints(container); err != nil { return err } diff --git a/daemon/delete.go b/daemon/delete.go index a2e7e5fa82..bf751ec2da 100644 --- a/daemon/delete.go +++ b/daemon/delete.go @@ -58,7 +58,7 @@ func (daemon *Daemon) ContainerRm(name string, config *ContainerRmConfig) error return err } - if err := container.removeMountPoints(config.RemoveVolume); err != nil { + if err := daemon.removeMountPoints(container, config.RemoveVolume); err != nil { logrus.Error(err) } diff --git a/daemon/mounts.go b/daemon/mounts.go new file mode 100644 index 0000000000..91d5c0953c --- /dev/null +++ b/daemon/mounts.go @@ -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 +}