mirror of
https://github.com/moby/moby.git
synced 2026-01-11 18:51:37 +00:00
Currently on daemon start volumes are "created" which involves invoking a volume driver if needed. If this process fails the mount is left in a bad state in which there is no source or Volume set. This now becomes an unrecoverable state in which that container can not be started. The only way to fix is to restart the daemon and hopefully you don't get another error on startup. This change moves "createVolume" to be done at container start. If the start fails it leaves it in the state in which you can try another start. If the second start can contact the volume driver everything will recover fine. Signed-off-by: Darren Shepherd <darren@rancher.com>
35 lines
969 B
Go
35 lines
969 B
Go
package daemon
|
|
|
|
import (
|
|
"strings"
|
|
|
|
"github.com/docker/docker/container"
|
|
derr "github.com/docker/docker/errors"
|
|
volumestore "github.com/docker/docker/volume/store"
|
|
)
|
|
|
|
func (daemon *Daemon) removeMountPoints(container *container.Container, rm bool) error {
|
|
var rmErrors []string
|
|
for _, m := range container.MountPoints {
|
|
if m.Volume == nil {
|
|
continue
|
|
}
|
|
daemon.volumes.Dereference(m.Volume, container.ID)
|
|
if rm {
|
|
err := daemon.volumes.Remove(m.Volume)
|
|
// Ignore volume in use errors 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 && !volumestore.IsInUse(err) {
|
|
rmErrors = append(rmErrors, err.Error())
|
|
}
|
|
}
|
|
}
|
|
if len(rmErrors) > 0 {
|
|
return derr.ErrorCodeRemovingVolume.WithArgs(strings.Join(rmErrors, "\n"))
|
|
}
|
|
return nil
|
|
}
|