github.com/openshift/moby-moby@v1.13.2-0.20170601211448-f5ec1e2936dc/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 "github.com/docker/docker/utils" 12 ) 13 14 var ( 15 validCheckpointNameChars = utils.RestrictedNameChars 16 validCheckpointNamePattern = utils.RestrictedNamePattern 17 ) 18 19 // CheckpointCreate checkpoints the process running in a container with CRIU 20 func (daemon *Daemon) CheckpointCreate(name string, config types.CheckpointCreateOptions) error { 21 container, err := daemon.GetContainer(name) 22 if err != nil { 23 return err 24 } 25 26 if !container.IsRunning() { 27 return fmt.Errorf("Container %s not running", name) 28 } 29 30 var checkpointDir string 31 if config.CheckpointDir != "" { 32 checkpointDir = config.CheckpointDir 33 } else { 34 checkpointDir = container.CheckpointDir() 35 } 36 37 if !validCheckpointNamePattern.MatchString(config.CheckpointID) { 38 return fmt.Errorf("Invalid checkpoint ID (%s), only %s are allowed", config.CheckpointID, validCheckpointNameChars) 39 } 40 41 err = daemon.containerd.CreateCheckpoint(container.ID, config.CheckpointID, checkpointDir, config.Exit) 42 if err != nil { 43 return fmt.Errorf("Cannot checkpoint container %s: %s", name, err) 44 } 45 46 daemon.LogContainerEvent(container, "checkpoint") 47 48 return nil 49 } 50 51 // CheckpointDelete deletes the specified checkpoint 52 func (daemon *Daemon) CheckpointDelete(name string, config types.CheckpointDeleteOptions) error { 53 container, err := daemon.GetContainer(name) 54 if err != nil { 55 return err 56 } 57 58 var checkpointDir string 59 if config.CheckpointDir != "" { 60 checkpointDir = config.CheckpointDir 61 } else { 62 checkpointDir = container.CheckpointDir() 63 } 64 65 return os.RemoveAll(filepath.Join(checkpointDir, config.CheckpointID)) 66 } 67 68 // CheckpointList lists all checkpoints of the specified container 69 func (daemon *Daemon) CheckpointList(name string, config types.CheckpointListOptions) ([]types.Checkpoint, error) { 70 var out []types.Checkpoint 71 72 container, err := daemon.GetContainer(name) 73 if err != nil { 74 return nil, err 75 } 76 77 var checkpointDir string 78 if config.CheckpointDir != "" { 79 checkpointDir = config.CheckpointDir 80 } else { 81 checkpointDir = container.CheckpointDir() 82 } 83 84 if err := os.MkdirAll(checkpointDir, 0755); err != nil { 85 return nil, err 86 } 87 88 dirs, err := ioutil.ReadDir(checkpointDir) 89 if err != nil { 90 return nil, err 91 } 92 93 for _, d := range dirs { 94 if !d.IsDir() { 95 continue 96 } 97 path := filepath.Join(checkpointDir, d.Name(), "config.json") 98 data, err := ioutil.ReadFile(path) 99 if err != nil { 100 return nil, err 101 } 102 var cpt types.Checkpoint 103 if err := json.Unmarshal(data, &cpt); err != nil { 104 return nil, err 105 } 106 out = append(out, cpt) 107 } 108 109 return out, nil 110 }