aboutsummaryrefslogtreecommitdiff
path: root/libpod
diff options
context:
space:
mode:
Diffstat (limited to 'libpod')
-rw-r--r--libpod/container_internal_linux.go9
-rw-r--r--libpod/oci.go21
-rw-r--r--libpod/runtime.go43
3 files changed, 25 insertions, 48 deletions
diff --git a/libpod/container_internal_linux.go b/libpod/container_internal_linux.go
index 9920efd55..b25645e5c 100644
--- a/libpod/container_internal_linux.go
+++ b/libpod/container_internal_linux.go
@@ -18,6 +18,7 @@ import (
cnitypes "github.com/containernetworking/cni/pkg/types/current"
crioAnnotations "github.com/containers/libpod/pkg/annotations"
"github.com/containers/libpod/pkg/chrootuser"
+ "github.com/containers/libpod/pkg/criu"
"github.com/containers/libpod/pkg/rootless"
"github.com/containers/storage/pkg/idtools"
spec "github.com/opencontainers/runtime-spec/specs-go"
@@ -368,6 +369,10 @@ func (c *Container) addNamespaceContainer(g *generate.Generator, ns LinuxNS, ctr
func (c *Container) checkpoint(ctx context.Context, keep bool) (err error) {
+ if !criu.CheckForCriu() {
+ return errors.Errorf("checkpointing a container requires at least CRIU %d", criu.MinCriuVersion)
+ }
+
if c.state.State != ContainerStateRunning {
return errors.Wrapf(ErrCtrStateInvalid, "%q is not running, cannot checkpoint", c.state.State)
}
@@ -407,6 +412,10 @@ func (c *Container) checkpoint(ctx context.Context, keep bool) (err error) {
func (c *Container) restore(ctx context.Context, keep bool) (err error) {
+ if !criu.CheckForCriu() {
+ return errors.Errorf("restoring a container requires at least CRIU %d", criu.MinCriuVersion)
+ }
+
if (c.state.State != ContainerStateConfigured) && (c.state.State != ContainerStateExited) {
return errors.Wrapf(ErrCtrStateInvalid, "container %s is running or paused, cannot restore", c.ID())
}
diff --git a/libpod/oci.go b/libpod/oci.go
index f6d320017..2257cd42f 100644
--- a/libpod/oci.go
+++ b/libpod/oci.go
@@ -17,6 +17,7 @@ import (
"github.com/containers/libpod/pkg/ctime"
"github.com/containers/libpod/pkg/rootless"
+ "github.com/containers/libpod/pkg/util"
"github.com/coreos/go-systemd/activation"
"github.com/cri-o/ocicni/pkg/ocicni"
spec "github.com/opencontainers/runtime-spec/specs-go"
@@ -230,7 +231,7 @@ func bindPorts(ports []ocicni.PortMapping) ([]*os.File, error) {
func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, restoreContainer bool) (err error) {
var stderrBuf bytes.Buffer
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -377,6 +378,7 @@ func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, res
childPipe.Close()
return err
}
+ defer cmd.Wait()
// We don't need childPipe on the parent side
childPipe.Close()
@@ -446,7 +448,7 @@ func (r *OCIRuntime) createOCIContainer(ctr *Container, cgroupParent string, res
func (r *OCIRuntime) updateContainerStatus(ctr *Container) error {
state := new(spec.State)
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -477,6 +479,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container) error {
}
return errors.Wrapf(err, "error getting container %s state. stderr/out: %s", ctr.ID(), out)
}
+ defer cmd.Wait()
errPipe.Close()
out, err := ioutil.ReadAll(outPipe)
@@ -556,7 +559,7 @@ func (r *OCIRuntime) updateContainerStatus(ctr *Container) error {
// Sets time the container was started, but does not save it.
func (r *OCIRuntime) startContainer(ctr *Container) error {
// TODO: streams should probably *not* be our STDIN/OUT/ERR - redirect to buffers?
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -573,7 +576,7 @@ func (r *OCIRuntime) startContainer(ctr *Container) error {
// killContainer sends the given signal to the given container
func (r *OCIRuntime) killContainer(ctr *Container, signal uint) error {
logrus.Debugf("Sending signal %d to container %s", signal, ctr.ID())
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -636,7 +639,7 @@ func (r *OCIRuntime) stopContainer(ctr *Container, timeout uint) error {
args = []string{"kill", "--all", ctr.ID(), "KILL"}
}
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -667,7 +670,7 @@ func (r *OCIRuntime) deleteContainer(ctr *Container) error {
// pauseContainer pauses the given container
func (r *OCIRuntime) pauseContainer(ctr *Container) error {
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -677,7 +680,7 @@ func (r *OCIRuntime) pauseContainer(ctr *Container) error {
// unpauseContainer unpauses the given container
func (r *OCIRuntime) unpauseContainer(ctr *Container) error {
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -698,7 +701,7 @@ func (r *OCIRuntime) execContainer(c *Container, cmd, capAdd, env []string, tty
return nil, errors.Wrapf(ErrEmptyID, "must provide a session ID for exec")
}
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return nil, err
}
@@ -780,7 +783,7 @@ func (r *OCIRuntime) execStopContainer(ctr *Container, timeout uint) error {
if len(execSessions) == 0 {
return nil
}
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return err
}
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 985af2849..f012d66c2 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -1,13 +1,11 @@
package libpod
import (
- "fmt"
"io/ioutil"
"os"
"os/exec"
"path/filepath"
"sync"
- "syscall"
"github.com/BurntSushi/toml"
is "github.com/containers/image/storage"
@@ -17,6 +15,7 @@ import (
"github.com/containers/libpod/pkg/hooks"
sysreg "github.com/containers/libpod/pkg/registries"
"github.com/containers/libpod/pkg/rootless"
+ "github.com/containers/libpod/pkg/util"
"github.com/containers/storage"
"github.com/cri-o/ocicni/pkg/ocicni"
"github.com/docker/docker/pkg/namesgenerator"
@@ -215,46 +214,12 @@ var (
}
)
-// GetRootlessRuntimeDir returns the runtime directory when running as non root
-func GetRootlessRuntimeDir() (string, error) {
- runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
- uid := fmt.Sprintf("%d", rootless.GetRootlessUID())
- if runtimeDir == "" {
- tmpDir := filepath.Join("/run", "user", uid)
- os.MkdirAll(tmpDir, 0700)
- st, err := os.Stat(tmpDir)
- if err == nil && int(st.Sys().(*syscall.Stat_t).Uid) == os.Getuid() && st.Mode().Perm() == 0700 {
- runtimeDir = tmpDir
- }
- }
- if runtimeDir == "" {
- tmpDir := filepath.Join(os.TempDir(), "user", uid)
- os.MkdirAll(tmpDir, 0700)
- st, err := os.Stat(tmpDir)
- if err == nil && int(st.Sys().(*syscall.Stat_t).Uid) == os.Getuid() && st.Mode().Perm() == 0700 {
- runtimeDir = tmpDir
- }
- }
- if runtimeDir == "" {
- home := os.Getenv("HOME")
- if home == "" {
- return "", fmt.Errorf("neither XDG_RUNTIME_DIR nor HOME was set non-empty")
- }
- resolvedHome, err := filepath.EvalSymlinks(home)
- if err != nil {
- return "", errors.Wrapf(err, "cannot resolve %s", home)
- }
- runtimeDir = filepath.Join(resolvedHome, "rundir")
- }
- return runtimeDir, nil
-}
-
func getDefaultTmpDir() (string, error) {
if !rootless.IsRootless() {
return "/var/run/libpod", nil
}
- rootlessRuntimeDir, err := GetRootlessRuntimeDir()
+ rootlessRuntimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return "", err
}
@@ -269,7 +234,7 @@ func SetXdgRuntimeDir(val string) error {
}
if val == "" {
var err error
- val, err = GetRootlessRuntimeDir()
+ val, err = util.GetRootlessRuntimeDir()
if err != nil {
return err
}
@@ -309,7 +274,7 @@ func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {
foundConfig = false
}
- runtimeDir, err := GetRootlessRuntimeDir()
+ runtimeDir, err := util.GetRootlessRuntimeDir()
if err != nil {
return nil, err
}