From ce7dded38baf5e8d64dc6d295d3d4a4fd5dd7a15 Mon Sep 17 00:00:00 2001 From: Daniel J Walsh Date: Mon, 22 Jul 2024 15:37:28 -0400 Subject: [PATCH] Add /run/containers/systemd, ${XDG_RUNTIME_DIR}/containers/systemd quadlet dirs Fixes: https://github.com/containers/podman/issues/23363 Signed-off-by: Daniel J Walsh --- cmd/quadlet/main.go | 8 +++++++- cmd/quadlet/main_test.go | 5 +++++ docs/source/markdown/podman-systemd.unit.5.md | 16 +++++++++++++--- pkg/systemd/quadlet/quadlet.go | 2 ++ 4 files changed, 27 insertions(+), 4 deletions(-) diff --git a/cmd/quadlet/main.go b/cmd/quadlet/main.go index eeab3d4c3f..fd5a792308 100644 --- a/cmd/quadlet/main.go +++ b/cmd/quadlet/main.go @@ -109,7 +109,7 @@ func Debugf(format string, a ...interface{}) { // This returns the directories where we read quadlet .container and .volumes from // For system generators these are in /usr/share/containers/systemd (for distro files) // and /etc/containers/systemd (for sysadmin files). -// For user generators these can live in /etc/containers/systemd/users, /etc/containers/systemd/users/$UID, and $XDG_CONFIG_HOME/containers/systemd +// For user generators these can live in $XDG_RUNTIME_DIR/containers/systemd, /etc/containers/systemd/users, /etc/containers/systemd/users/$UID, and $XDG_CONFIG_HOME/containers/systemd func getUnitDirs(rootless bool) []string { // Allow overriding source dir, this is mainly for the CI tests unitDirsEnv := os.Getenv("QUADLET_UNIT_DIRS") @@ -127,6 +127,11 @@ func getUnitDirs(rootless bool) []string { } if rootless { + runtimeDir, found := os.LookupEnv("XDG_RUNTIME_DIR") + if found { + dirs = appendSubPaths(dirs, path.Join(runtimeDir, "containers/systemd"), false, nil) + } + configDir, err := os.UserConfigDir() if err != nil { fmt.Fprintf(os.Stderr, "Warning: %v", err) @@ -143,6 +148,7 @@ func getUnitDirs(rootless bool) []string { return append(dirs, filepath.Join(quadlet.UnitDirAdmin, "users")) } + dirs = appendSubPaths(dirs, quadlet.UnitDirTemp, false, userLevelFilter) dirs = appendSubPaths(dirs, quadlet.UnitDirAdmin, false, userLevelFilter) return appendSubPaths(dirs, quadlet.UnitDirDistro, false, nil) } diff --git a/cmd/quadlet/main_test.go b/cmd/quadlet/main_test.go index 7ecc9a0cfe..15704d8344 100644 --- a/cmd/quadlet/main_test.go +++ b/cmd/quadlet/main_test.go @@ -48,6 +48,7 @@ func TestIsUnambiguousName(t *testing.T) { func TestUnitDirs(t *testing.T) { rootDirs := []string{} + rootDirs = appendSubPaths(rootDirs, quadlet.UnitDirTemp, false, userLevelFilter) rootDirs = appendSubPaths(rootDirs, quadlet.UnitDirAdmin, false, userLevelFilter) rootDirs = appendSubPaths(rootDirs, quadlet.UnitDirDistro, false, userLevelFilter) unitDirs := getUnitDirs(false) @@ -60,6 +61,10 @@ func TestUnitDirs(t *testing.T) { rootlessDirs := []string{} + runtimeDir, found := os.LookupEnv("XDG_RUNTIME_DIR") + if found { + rootlessDirs = appendSubPaths(rootlessDirs, path.Join(runtimeDir, "containers/systemd"), false, nil) + } rootlessDirs = appendSubPaths(rootlessDirs, path.Join(configDir, "containers/systemd"), false, nil) rootlessDirs = appendSubPaths(rootlessDirs, filepath.Join(quadlet.UnitDirAdmin, "users"), true, nonNumericFilter) rootlessDirs = appendSubPaths(rootlessDirs, filepath.Join(quadlet.UnitDirAdmin, "users", u.Uid), true, userLevelFilter) diff --git a/docs/source/markdown/podman-systemd.unit.5.md b/docs/source/markdown/podman-systemd.unit.5.md index 90f782b1a8..7fa1301248 100644 --- a/docs/source/markdown/podman-systemd.unit.5.md +++ b/docs/source/markdown/podman-systemd.unit.5.md @@ -10,15 +10,25 @@ podman\-systemd.unit - systemd units using Podman Quadlet ### Podman rootful unit search path -Quadlet files for the root user can be placed in the following two directories: +Quadlet files for the root user can be placed in the following directories ordered in precedence. Meaning duplicate named quadlets found under /run take precedence over ones in /etc, as well as those in /usr: - * /etc/containers/systemd/ - * /usr/share/containers/systemd/ +Temporary quadlets, usually used for testing: + +* /run/containers/systemd/ + +System administrator's defined quadlets: + +* /etc/containers/systemd/ + +Distribution defined quadlets: + +* /usr/share/containers/systemd/ ### Podman rootless unit search path Quadlet files for non-root users can be placed in the following directories + * $XDG_RUNTIME_DIR/containers/systemd/ * $XDG_CONFIG_HOME/containers/systemd/ or ~/.config/containers/systemd/ * /etc/containers/systemd/users/$(UID) * /etc/containers/systemd/users/ diff --git a/pkg/systemd/quadlet/quadlet.go b/pkg/systemd/quadlet/quadlet.go index c21ec2a151..329f3883bc 100644 --- a/pkg/systemd/quadlet/quadlet.go +++ b/pkg/systemd/quadlet/quadlet.go @@ -20,6 +20,8 @@ const ( // github.com/containers/podman/v5/libpod/define.AutoUpdateLabel // but it is causing bloat autoUpdateLabel = "io.containers.autoupdate" + // Directory for temporary Quadlet files (sysadmin owned) + UnitDirTemp = "/run/containers/systemd" // Directory for global Quadlet files (sysadmin owned) UnitDirAdmin = "/etc/containers/systemd" // Directory for global Quadlet files (distro owned)