github.com/titanous/docker@v1.4.1/daemon/graphdriver/vfs/driver.go (about)

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