checkpoint.go 2.6 KB

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