diff options
Diffstat (limited to 'libpod/runtime.go')
-rw-r--r-- | libpod/runtime.go | 35 |
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) { |