//! Primitives de cycle de vie de container pour un [`DevContainer`] analysé. //! //! Cette crate pilote l'API du daemon de containers pour construire l'image //! devcontainer, démarrer un container et y copier le workspace, exécuter les //! hooks `postCreateCommand` / `postStartCommand` et lancer des commandes à //! l'intérieur du container en cours d'exécution. //! //! Le daemon est joint par son **socket** (celui de l'hôte, monté dans le //! container de Herald) : [`ContainerRuntime::connect`] suit `DOCKER_HOST` comme //! le fait le CLI `docker`, et retombe sur le socket local. Aucun binaire de //! runtime n'est donc requis dans l'image, et `podman` fonctionne de la même //! façon dès lors qu'il expose son socket compatible Docker. //! //! # Isolation //! //! Chaque sandbox dispose de son propre tag d'image, de son propre container et de //! son propre réseau. Le container démarre attaché à ce réseau afin que les hooks //! `postCreateCommand` / `postStartCommand` puissent récupérer des dépendances //! (par ex. `npm install`) ; une fois les hooks exécutés, le container est déconnecté //! du réseau pour le reste de sa durée de vie. Chaque commande est bornée par un timeout. //! //! Les `runArgs` du `devcontainer.json` sont lus mais pas transmis au daemon : ils //! viennent du dépôt, donc d'une pull request non fiable, et pourraient rattacher le //! container à un autre réseau ou lui donner des privilèges qui annuleraient cette //! isolation. mod consts; mod container; mod context; mod devcontainer; mod errors; mod exec; mod path; mod runtime; mod schema; pub use container::Container; pub use devcontainer::DevContainer; pub use errors::{ContainerError, ParseError}; pub use exec::ExecOutput; pub use path::normalize; pub use runtime::ContainerRuntime; pub use schema::{DevContainerBuildSchema, DevContainerSchema, parse};