feat: podman-compose stack units and root/user execution scopes
- syncup: podman first, docker only as fallback (podman wins on name clash;
existing docker units found in podman switch to podman)
- syncup: group podman-compose containers into one `kind: stack` unit per
project (project, working_dir, compose_files, compose_bin from labels);
disable existing member units ("part of stack <project>")
- generator: compose mode (podman-compose up/stop, WorkingDirectory) with
pod start/stop fallback when compose binary/dir/files are missing
- reconcile: stacks disabled with "stack not found" when neither compose
files nor pod exist
- root: scan root + rootless users listed in `users:` (podman only)
- non-root: config ~/.config/unitdore/units.yaml, own user units only
- sysuser package: runuser with XDG_RUNTIME_DIR/DBUS env, home/linger lookup
- install: warn when linger is not enabled for user units
- testdata/stack: podman-compose test stack and captured podman ps fixture
- docs: README, generated-units, man page, AGENTS, PLAN
This commit is contained in:
Vendored
+15
@@ -0,0 +1,15 @@
|
||||
# Test stack for unitdore compose-stack detection.
|
||||
# Run: podman-compose -p unitdore-test up -d
|
||||
name: unitdore-test
|
||||
|
||||
services:
|
||||
web:
|
||||
image: docker.io/library/alpine:latest
|
||||
init: true
|
||||
command: ["sleep", "infinity"]
|
||||
depends_on:
|
||||
- db
|
||||
db:
|
||||
image: docker.io/library/alpine:latest
|
||||
init: true
|
||||
command: ["sleep", "infinity"]
|
||||
Vendored
+100
@@ -0,0 +1,100 @@
|
||||
[
|
||||
{
|
||||
"AutoRemove": false,
|
||||
"Command": [
|
||||
"sleep",
|
||||
"infinity"
|
||||
],
|
||||
"CreatedAt": "6 seconds ago",
|
||||
"CIDFile": "",
|
||||
"Exited": false,
|
||||
"ExitedAt": -62135596800,
|
||||
"ExitCode": 0,
|
||||
"ExposedPorts": null,
|
||||
"Id": "6d5a1e4d8ab39d64b26842a0e50b5943cfa62d71c70d63ce5c2ad92f598811b9",
|
||||
"Image": "docker.io/library/alpine:latest",
|
||||
"ImageID": "a40c03cbb81c59bfb0e0887ab0b1859727075da7b9cc576a1cec2c771f38c5fb",
|
||||
"IsInfra": false,
|
||||
"Labels": {
|
||||
"PODMAN_SYSTEMD_UNIT": "podman-compose@unitdore-test.service",
|
||||
"com.docker.compose.container-number": "1",
|
||||
"com.docker.compose.project": "unitdore-test",
|
||||
"com.docker.compose.project.config_files": "compose.yaml",
|
||||
"com.docker.compose.project.working_dir": "/home/warkanum/dev/unitdore/testdata/stack",
|
||||
"com.docker.compose.service": "db",
|
||||
"io.podman.compose.config-hash": "1a54723a4ead4531f2ddce5aa7e85019b4ebd1612ca8973b85cd9026f4f87949",
|
||||
"io.podman.compose.project": "unitdore-test",
|
||||
"io.podman.compose.service": "db",
|
||||
"io.podman.compose.version": "1.6.0"
|
||||
},
|
||||
"Mounts": [],
|
||||
"Names": [
|
||||
"unitdore-test_db_1"
|
||||
],
|
||||
"Namespaces": {
|
||||
|
||||
},
|
||||
"Networks": [
|
||||
"unitdore-test_default"
|
||||
],
|
||||
"Pid": 75799,
|
||||
"Pod": "235775e179ed8413b84b823ff63a812a053d929b8399b2d48cc19f9a4eeef410",
|
||||
"PodName": "",
|
||||
"Ports": null,
|
||||
"Restarts": 0,
|
||||
"Size": null,
|
||||
"StartedAt": 1791823934,
|
||||
"State": "running",
|
||||
"Status": "Up 6 seconds",
|
||||
"Created": 1791823933
|
||||
},
|
||||
{
|
||||
"AutoRemove": false,
|
||||
"Command": [
|
||||
"sleep",
|
||||
"infinity"
|
||||
],
|
||||
"CreatedAt": "6 seconds ago",
|
||||
"CIDFile": "",
|
||||
"Exited": false,
|
||||
"ExitedAt": -62135596800,
|
||||
"ExitCode": 0,
|
||||
"ExposedPorts": null,
|
||||
"Id": "b6b364f2a885baa583b7112cd7d37832e7f11f9091698ef76ca4c44259e501cc",
|
||||
"Image": "docker.io/library/alpine:latest",
|
||||
"ImageID": "a40c03cbb81c59bfb0e0887ab0b1859727075da7b9cc576a1cec2c771f38c5fb",
|
||||
"IsInfra": false,
|
||||
"Labels": {
|
||||
"PODMAN_SYSTEMD_UNIT": "podman-compose@unitdore-test.service",
|
||||
"com.docker.compose.container-number": "1",
|
||||
"com.docker.compose.project": "unitdore-test",
|
||||
"com.docker.compose.project.config_files": "compose.yaml",
|
||||
"com.docker.compose.project.working_dir": "/home/warkanum/dev/unitdore/testdata/stack",
|
||||
"com.docker.compose.service": "web",
|
||||
"io.podman.compose.config-hash": "f38934df837f52ead7f2848b58acef10380a7929125a7c4f61199ad5b557302f",
|
||||
"io.podman.compose.project": "unitdore-test",
|
||||
"io.podman.compose.service": "web",
|
||||
"io.podman.compose.version": "1.6.0"
|
||||
},
|
||||
"Mounts": [],
|
||||
"Names": [
|
||||
"unitdore-test_web_1"
|
||||
],
|
||||
"Namespaces": {
|
||||
|
||||
},
|
||||
"Networks": [
|
||||
"unitdore-test_default"
|
||||
],
|
||||
"Pid": 75919,
|
||||
"Pod": "235775e179ed8413b84b823ff63a812a053d929b8399b2d48cc19f9a4eeef410",
|
||||
"PodName": "",
|
||||
"Ports": null,
|
||||
"Restarts": 0,
|
||||
"Size": null,
|
||||
"StartedAt": 1791823934,
|
||||
"State": "running",
|
||||
"Status": "Up 6 seconds",
|
||||
"Created": 1791823933
|
||||
}
|
||||
]
|
||||
Reference in New Issue
Block a user