daemon/mounts.go
2c72015c
 package daemon
 
 import (
 	"strings"
 
6bb0d181
 	"github.com/docker/docker/container"
2c72015c
 	derr "github.com/docker/docker/errors"
43012fe8
 	volumestore "github.com/docker/docker/volume/store"
2c72015c
 )
 
aab35963
 func (daemon *Daemon) prepareMountPoints(container *container.Container) error {
 	for _, config := range container.MountPoints {
 		if err := daemon.lazyInitializeVolume(container.ID, config); err != nil {
 			return err
 		}
 	}
 	return nil
 }
 
6bb0d181
 func (daemon *Daemon) removeMountPoints(container *container.Container, rm bool) error {
2c72015c
 	var rmErrors []string
 	for _, m := range container.MountPoints {
 		if m.Volume == nil {
 			continue
 		}
d3eca445
 		daemon.volumes.Dereference(m.Volume, container.ID)
2c72015c
 		if rm {
be311fba
 			// Do not remove named mountpoints
 			// these are mountpoints specified like `docker run -v <name>:/foo`
 			if m.Named {
 				continue
 			}
2c72015c
 			err := daemon.volumes.Remove(m.Volume)
d3eca445
 			// Ignore volume in use errors because having this
2c72015c
 			// 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.
43012fe8
 			if err != nil && !volumestore.IsInUse(err) {
2c72015c
 				rmErrors = append(rmErrors, err.Error())
 			}
 		}
 	}
 	if len(rmErrors) > 0 {
 		return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
 	}
 	return nil
 }