| package containerfs |
| |
| import ( |
| "path/filepath" |
| "runtime" |
| |
| "github.com/containerd/continuity/driver" |
| "github.com/containerd/continuity/pathdriver" |
| "github.com/docker/docker/pkg/symlink" |
| ) |
| |
| // ContainerFS is that represents a root file system |
| type ContainerFS interface { |
| // Path returns the path to the root. Note that this may not exist |
| // on the local system, so the continuity operations must be used |
| Path() string |
| |
| // ResolveScopedPath evaluates the given path scoped to the root. |
| // For example, if root=/a, and path=/b/c, then this function would return /a/b/c. |
| // If rawPath is true, then the function will not preform any modifications |
| // before path resolution. Otherwise, the function will clean the given path |
| // by making it an absolute path. |
| ResolveScopedPath(path string, rawPath bool) (string, error) |
| |
| Driver |
| } |
| |
| // Driver combines both continuity's Driver and PathDriver interfaces with a Platform |
| // field to determine the OS. |
| type Driver interface { |
| // OS returns the OS where the rootfs is located. Essentially, |
| // runtime.GOOS for everything aside from LCOW, which is "linux" |
| OS() string |
| |
| // Architecture returns the hardware architecture where the |
| // container is located. |
| Architecture() string |
| |
| // Driver & PathDriver provide methods to manipulate files & paths |
| driver.Driver |
| pathdriver.PathDriver |
| } |
| |
| // NewLocalContainerFS is a helper function to implement daemon's Mount interface |
| // when the graphdriver mount point is a local path on the machine. |
| func NewLocalContainerFS(path string) ContainerFS { |
| return &local{ |
| path: path, |
| Driver: driver.LocalDriver, |
| PathDriver: pathdriver.LocalPathDriver, |
| } |
| } |
| |
| // NewLocalDriver provides file and path drivers for a local file system. They are |
| // essentially a wrapper around the `os` and `filepath` functions. |
| func NewLocalDriver() Driver { |
| return &local{ |
| Driver: driver.LocalDriver, |
| PathDriver: pathdriver.LocalPathDriver, |
| } |
| } |
| |
| type local struct { |
| path string |
| driver.Driver |
| pathdriver.PathDriver |
| } |
| |
| func (l *local) Path() string { |
| return l.path |
| } |
| |
| func (l *local) ResolveScopedPath(path string, rawPath bool) (string, error) { |
| cleanedPath := path |
| if !rawPath { |
| cleanedPath = cleanScopedPath(path) |
| } |
| return symlink.FollowSymlinkInScope(filepath.Join(l.path, cleanedPath), l.path) |
| } |
| |
| func (l *local) OS() string { |
| return runtime.GOOS |
| } |
| |
| func (l *local) Architecture() string { |
| return runtime.GOARCH |
| } |