summaryrefslogtreecommitdiff
path: root/libpod/runtime.go
diff options
context:
space:
mode:
Diffstat (limited to 'libpod/runtime.go')
-rw-r--r--libpod/runtime.go35
1 files changed, 34 insertions, 1 deletions
diff --git a/libpod/runtime.go b/libpod/runtime.go
index 05b8134b8..5d4b895cb 100644
--- a/libpod/runtime.go
+++ b/libpod/runtime.go
@@ -2,10 +2,12 @@ package libpod
import (
"bytes"
+ "fmt"
"io/ioutil"
"os"
"path/filepath"
"sync"
+ "syscall"
"github.com/BurntSushi/toml"
is "github.com/containers/image/storage"
@@ -164,7 +166,7 @@ var (
CgroupManager: CgroupfsCgroupsManager,
HooksDir: hooks.DefaultDir,
StaticDir: filepath.Join(storage.DefaultStoreOptions.GraphRoot, "libpod"),
- TmpDir: "/var/run/libpod",
+ TmpDir: getDefaultTmpDir(),
MaxLogSize: -1,
NoPivotRoot: false,
CNIConfigDir: "/etc/cni/net.d/",
@@ -172,6 +174,37 @@ var (
}
)
+// GetRootlessRuntimeDir returns the runtime directory when running as non root
+func GetRootlessRuntimeDir() string {
+ hasNoEnv := false
+ runtimeDir := os.Getenv("XDG_RUNTIME_DIR")
+ if runtimeDir == "" {
+ hasNoEnv = true
+ tmpDir := filepath.Join(os.TempDir(), "user", fmt.Sprintf("%d", os.Getuid()))
+ 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 == "" {
+ runtimeDir = filepath.Join(os.Getenv("HOME"), "rundir")
+ }
+ if hasNoEnv {
+ os.Setenv("XDG_RUNTIME_DIR", runtimeDir)
+ }
+ return runtimeDir
+}
+
+func getDefaultTmpDir() string {
+ if os.Getuid() == 0 {
+ return "/var/run/libpod"
+ }
+
+ rootlessRuntimeDir := GetRootlessRuntimeDir()
+ return filepath.Join(rootlessRuntimeDir, "libpod", "tmp")
+}
+
// NewRuntime creates a new container runtime
// Options can be passed to override the default configuration for the runtime
func NewRuntime(options ...RuntimeOption) (runtime *Runtime, err error) {