github.com/kim0/docker@v0.6.2-0.20161130212042-4addda3f07e7/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 var checkpointDir string 25 if config.CheckpointDir != "" { 26 checkpointDir = config.CheckpointDir 27 } else { 28 checkpointDir = container.CheckpointDir() 29 } 30 31 err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, checkpointDir, config.Exit) 32 if err != nil { 33 return fmt.Errorf("Cannot checkpoint container %s: %s", name, err) 34 } 35 36 daemon.LogContainerEvent(container, "checkpoint") 37 38 return nil 39 } 40 41 // CheckpointDelete deletes the specified checkpoint 42 func (daemon *Daemon) CheckpointDelete(name string, config types.CheckpointDeleteOptions) error { 43 container, err := daemon.GetContainer(name) 44 if err != nil { 45 return err 46 } 47 48 var checkpointDir string 49 if config.CheckpointDir != "" { 50 checkpointDir = config.CheckpointDir 51 } else { 52 checkpointDir = container.CheckpointDir() 53 } 54 55 return os.RemoveAll(filepath.Join(checkpointDir, config.CheckpointID)) 56 } 57 58 // CheckpointList lists all checkpoints of the specified container 59 func (daemon *Daemon) CheckpointList(name string, config types.CheckpointListOptions) ([]types.Checkpoint, error) { 60 var out []types.Checkpoint 61 62 container, err := daemon.GetContainer(name) 63 if err != nil { 64 return nil, err 65 } 66 67 var checkpointDir string 68 if config.CheckpointDir != "" { 69 checkpointDir = config.CheckpointDir 70 } else { 71 checkpointDir = container.CheckpointDir() 72 } 73 74 if err := os.MkdirAll(checkpointDir, 0755); err != nil { 75 return nil, err 76 } 77 78 dirs, err := ioutil.ReadDir(checkpointDir) 79 if err != nil { 80 return nil, err 81 } 82 83 for _, d := range dirs { 84 if !d.IsDir() { 85 continue 86 } 87 path := filepath.Join(checkpointDir, d.Name(), "config.json") 88 data, err := ioutil.ReadFile(path) 89 if err != nil { 90 return nil, err 91 } 92 var cpt types.Checkpoint 93 if err := json.Unmarshal(data, &cpt); err != nil { 94 return nil, err 95 } 96 out = append(out, cpt) 97 } 98 99 return out, nil 100 }