github.com/daaku/docker@v1.5.0/daemon/graphdriver/vfs/driver.go (about)

     1  package vfs
     2  
     3  import (
     4  	"fmt"
     5  	"os"
     6  	"path"
     7  
     8  	"github.com/docker/docker/daemon/graphdriver"
     9  	"github.com/docker/docker/pkg/chrootarchive"
    10  	"github.com/docker/libcontainer/label"
    11  )
    12  
    13  func init() {
    14  	graphdriver.Register("vfs", Init)
    15  }
    16  
    17  func Init(home string, options []string) (graphdriver.Driver, error) {
    18  	d := &Driver{
    19  		home: home,
    20  	}
    21  	return graphdriver.NaiveDiffDriver(d), nil
    22  }
    23  
    24  type Driver struct {
    25  	home string
    26  }
    27  
    28  func (d *Driver) String() string {
    29  	return "vfs"
    30  }
    31  
    32  func (d *Driver) Status() [][2]string {
    33  	return nil
    34  }
    35  
    36  func (d *Driver) Cleanup() error {
    37  	return nil
    38  }
    39  
    40  func (d *Driver) Create(id, parent string) error {
    41  	dir := d.dir(id)
    42  	if err := os.MkdirAll(path.Dir(dir), 0700); err != nil {
    43  		return err
    44  	}
    45  	if err := os.Mkdir(dir, 0755); err != nil {
    46  		return err
    47  	}
    48  	opts := []string{"level:s0"}
    49  	if _, mountLabel, err := label.InitLabels(opts); err == nil {
    50  		label.Relabel(dir, mountLabel, "")
    51  	}
    52  	if parent == "" {
    53  		return nil
    54  	}
    55  	parentDir, err := d.Get(parent, "")
    56  	if err != nil {
    57  		return fmt.Errorf("%s: %s", parent, err)
    58  	}
    59  	if err := chrootarchive.CopyWithTar(parentDir, dir); err != nil {
    60  		return err
    61  	}
    62  	return nil
    63  }
    64  
    65  func (d *Driver) dir(id string) string {
    66  	return path.Join(d.home, "dir", path.Base(id))
    67  }
    68  
    69  func (d *Driver) Remove(id string) error {
    70  	if _, err := os.Stat(d.dir(id)); err != nil {
    71  		return err
    72  	}
    73  	return os.RemoveAll(d.dir(id))
    74  }
    75  
    76  func (d *Driver) Get(id, mountLabel string) (string, error) {
    77  	dir := d.dir(id)
    78  	if st, err := os.Stat(dir); err != nil {
    79  		return "", err
    80  	} else if !st.IsDir() {
    81  		return "", fmt.Errorf("%s: not a directory", dir)
    82  	}
    83  	return dir, nil
    84  }
    85  
    86  func (d *Driver) Put(id string) error {
    87  	// The vfs driver has no runtime resources (e.g. mounts)
    88  	// to clean up, so we don't need anything here
    89  	return nil
    90  }
    91  
    92  func (d *Driver) Exists(id string) bool {
    93  	_, err := os.Stat(d.dir(id))
    94  	return err == nil
    95  }