github.com/hms58/moby@v1.13.1/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  }