| package images | |
| import ( | |
| "context" | |
| "fmt" | |
| "runtime" | |
| "github.com/containerd/log" | |
| "github.com/docker/docker/container" | |
| "github.com/pkg/errors" | |
| ) | |
| // Mount sets container.BaseFS | |
| // (is it not set coming in? why is it unset?) | |
| func (i *ImageService) Mount(ctx context.Context, container *container.Container) error { | |
| if container.RWLayer == nil { | |
| return errors.New("RWLayer of container " + container.ID + " is unexpectedly nil") | |
| } | |
| dir, err := container.RWLayer.Mount(container.GetMountLabel()) | |
| if err != nil { | |
| return err | |
| } | |
| log.G(ctx).WithField("container", container.ID).Debugf("container mounted via layerStore: %v", dir) | |
| if container.BaseFS != "" && container.BaseFS != dir { | |
| // The mount path reported by the graph driver should always be trusted on Windows, since the | |
| // volume path for a given mounted layer may change over time. This should only be an error | |
| // on non-Windows operating systems. | |
| if runtime.GOOS != "windows" { | |
| i.Unmount(ctx, container) | |
| return fmt.Errorf("Error: driver %s is returning inconsistent paths for container %s ('%s' then '%s')", | |
| i.StorageDriver(), container.ID, container.BaseFS, dir) | |
| } | |
| } | |
| container.BaseFS = dir // TODO: combine these fields | |
| return nil | |
| } | |
| // Unmount unsets the container base filesystem | |
| func (i *ImageService) Unmount(ctx context.Context, container *container.Container) error { | |
| if container.RWLayer == nil { | |
| return errors.New("RWLayer of container " + container.ID + " is unexpectedly nil") | |
| } | |
| if err := container.RWLayer.Unmount(); err != nil { | |
| log.G(ctx).WithField("container", container.ID).WithError(err).Error("error unmounting container") | |
| return err | |
| } | |
| return nil | |
| } |