To make the review of your request easier, please use the following template to provide all the required details and also include any other information that may be relevant.
-
name: raind
-
description: Raind is an open-source local container runtime and lightweight workload orchestrator for Linux. It provides Docker-like container commands and Kubernetes-inspired resources. Raind is intended for local development, testing, and experimentation with container workloads, including image management, OCI-style container execution, networking, traffic observation, and policy-based communication control.
-
snapcraft: Raind/snap/snapcraft.yaml at main · shizuku198411/Raind · GitHub
-
upstream: GitHub - shizuku198411/Raind: Workload-Centric Container Runtime · GitHub
-
upstream-relation: I am the upstream author and maintainer of the Raind project, and I am also the publisher of this snap.
-
supported-category: tools for local, non-root user driven configuration of/switching to development workspaces/environments
-
reasoning: Raind requires classic confinement because it is not a regular desktop or server application that only needs access to a fixed set of files, sockets, or devices. Raind is a local container runtime and lightweight workload orchestrator. Its core purpose is to create and manage Linux container execution environments on the host.
Raind needs to perform container-runtime operations such as:
-
creating and joining Linux namespaces for workloads
-
setting up container root filesystems, bind mounts, overlay-backed layers, and root switching for container processes
-
managing cgroup v2 subtrees for container processes under
/sys/fs/cgroup/raind -
creating bridges and veth pairs, moving interfaces into container network namespaces, assigning container IP addresses and routes, and configuring DNS behavior
-
configuring NAT, FORWARD, DNAT, and policy rules for published ports and container traffic
-
executing user-specified container commands inside the target namespaces and root filesystem
-
supporting user-requested bind mounts and hostPath-style volumes, where the host paths are selected at runtime by the user rather than known statically at snap build time
I evaluated a devmode build to identify the accesses that would be blocked by strict confinement. In devmode, Raind was able to start the daemon, pull images, create a network, start a rootful nginx container, run
container exec, and create a container with a published port. However, the audit logs showed many AppArmor/seccomp policy events for operations that are core to Raind’s runtime behavior and are only allowed because the snap was installed in devmode.The collected evidence includes AppArmor/seccomp events for:
-
cgroup v2 access under
/sys/fs/cgroup/raind -
execution of networking tools such as
ipand iptables/nftables helpers -
netlink/network operations used for bridge, veth, routing, and namespace setup
-
mount-related operations used by the container runtime
-
nsenter/runtime process execution paths used for container exec -
snap namespace visibility issues for user-specified bind mount paths such as
/tmp/..., where the daemon could not see a host path that exists from the user’s shell
These are not optional convenience features. They are the basic mechanisms by which Raind creates and manages local container workloads.
Existing strict confinement interfaces are not sufficient for this snap. Interfaces such as
network,network-bind,network-control,system-files,personal-files, andhomecan cover specific categories of access, but Raind needs to combine dynamic namespace creation, mount/rootfs management, cgroup management, dynamic hostPath/bind mounts, low-level network namespace setup, firewall/NAT rule management, and arbitrary workload execution inside containers. The required paths and resources are not all known statically in advance, because they depend on the images, container definitions, bind mounts, ports, networks, and workload resources requested by the user at runtime.The requirement is not simply to access arbitrary host files or to execute host-provided helper binaries. The requirement is to operate as a local container runtime that creates and manages kernel isolation primitives and workload execution contexts on behalf of the user. Under strict confinement, snapd’s AppArmor/seccomp policy would prevent these core runtime operations or make the runtime unable to correctly interact with the host namespaces, cgroups, networking stack, and user-selected bind mount paths.
For this reason, Raind cannot provide its intended container runtime functionality under strict confinement, and classic confinement is required.
The upstream repository is public. The current Snap Store revision may temporarily lag behind the latest upstream main branch while the classic confinement review is in progress. The snap is built from the same upstream project and the snap packaging files are maintained in that repository.
-
I understand that strict confinement is generally preferred over classic.
I’ve tried the existing interfaces to make the snap to work under strict confinement.
Note that snappy-debug can be used to identify possible required interfaces. See https ://snapcraft.io/docs/debug-snaps for more information.