github.com/vieux/docker@v0.6.3-0.20161004191708-e097c2a938c7/daemon/checkpoint.go (about) 1 package daemon 2 3 import ( 4 "encoding/json" 5 "fmt" 6 "io/ioutil" 7 "os" 8 "path/filepath" 9 10 "github.com/docker/docker/api/types" 11 ) 12 13 // CheckpointCreate checkpoints the process running in a container with CRIU 14 func (daemon *Daemon) CheckpointCreate(name string, config types.CheckpointCreateOptions) error { 15 container, err := daemon.GetContainer(name) 16 if err != nil { 17 return err 18 } 19 20 if !container.IsRunning() { 21 return fmt.Errorf("Container %s not running", name) 22 } 23 24 err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, container.CheckpointDir(), config.Exit) 25 if err != nil { 26 return fmt.Errorf("Cannot checkpoint container %s: %s", name, err) 27 } 28 29 daemon.LogContainerEvent(container, "checkpoint") 30 31 return nil 32 } 33 34 // CheckpointDelete deletes the specified checkpoint 35 func (daemon *Daemon) CheckpointDelete(name string, checkpoint string) error { 36 container, err := daemon.GetContainer(name) 37 if err != nil { 38 return err 39 } 40 41 checkpointDir := container.CheckpointDir() 42 return os.RemoveAll(filepath.Join(checkpointDir, checkpoint)) 43 } 44 45 // CheckpointList lists all checkpoints of the specified container 46 func (daemon *Daemon) CheckpointList(name string) ([]types.Checkpoint, error) { 47 var out []types.Checkpoint 48 49 container, err := daemon.GetContainer(name) 50 if err != nil { 51 return nil, err 52 } 53 54 checkpointDir := container.CheckpointDir() 55 if err := os.MkdirAll(checkpointDir, 0755); err != nil { 56 return nil, err 57 } 58 59 dirs, err := ioutil.ReadDir(checkpointDir) 60 if err != nil { 61 return nil, err 62 } 63 64 for _, d := range dirs { 65 if !d.IsDir() { 66 continue 67 } 68 path := filepath.Join(checkpointDir, d.Name(), "config.json") 69 data, err := ioutil.ReadFile(path) 70 if err != nil { 71 return nil, err 72 } 73 var cpt types.Checkpoint 74 if err := json.Unmarshal(data, &cpt); err != nil { 75 return nil, err 76 } 77 out = append(out, cpt) 78 } 79 80 return out, nil 81 }