code: func (container *Container) DetachAndUnmount(volumeEventLog func(name, action string, attributes map[string]string)) error {
  	networkMounts := container.NetworkMounts()
  	mountPaths := make([]string, 0, len(container.MountPoints)+len(networkMounts))
  
  	for _, mntPoint := range container.MountPoints {
  		dest, err := container.GetResourcePath(mntPoint.Destination)
  		if err != nil {
  			logrus.Warnf("Failed to get volume destination path for container '%s' at '%s' while lazily unmounting: %v", container.ID, mntPoint.Destination, err)
  			continue
  		}
  		mountPaths = append(mountPaths, dest)
  	}
  
  	for _, m := range networkMounts {
  		dest, err := container.GetResourcePath(m.Destination)
  		if err != nil {
  			logrus.Warnf("Failed to get volume destination path for container '%s' at '%s' while lazily unmounting: %v", container.ID, m.Destination, err)
  			continue
  		}
  		mountPaths = append(mountPaths, dest)
  	}
  
  	for _, mountPath := range mountPaths {
  		if err := mount.Unmount(mountPath); err != nil {
  			logrus.WithError(err).WithField("container", container.ID).
  				Warn("Unable to unmount")
  		}
  	}
  	return container.UnmountVolumes(volumeEventLog)
  }
docs: // DetachAndUnmount uses a detached mount on all mount destinations, then
  // unmounts each volume normally.
  // This is used from daemon/archive for `docker cp`