| 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 |
| } |