diff --git a/README.md b/README.md index 8d81749..04e127f 100644 --- a/README.md +++ b/README.md @@ -110,6 +110,10 @@ each video's `rel_path` carries its subfolder, which the dashboard shows in a ** > In-app NFS mounting needs `nfs-common` (in the image) and the server container's `cap_add: SYS_ADMIN` > + `security_opt: apparmor:unconfined` (in `docker-compose.yml`; use `privileged: true` if your host's > `mount.nfs` still refuses). `local`-only deployments need none of this. +> +> The server service also sets `init: true` — it spawns exiftool/mount.nfs children as PID 1, and +> without an init their orphans become unreapable zombies that block `docker stop` +> ("PID … is zombie and can not be killed"). Keep it if you copy the service elsewhere. ### Roles diff --git a/docker-compose.yml b/docker-compose.yml index c1622a1..06104b0 100644 --- a/docker-compose.yml +++ b/docker-compose.yml @@ -19,6 +19,10 @@ services: server: restart: unless-stopped + # The server spawns exiftool + mount.nfs children; without an init as PID 1 + # their orphans become unreapable zombies and docker can't stop the container + # ("PID … is zombie and can not be killed"). tini forwards signals + reaps. + init: true build: context: . dockerfile: server/Dockerfile