1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
//! strop-containers: attach to an *existing* container on the local Docker
//! engine and browse/read its filesystem (0037 DC1a — browse/read).
//!
//! # Capability boundary (read-only by construction)
//!
//! This crate exposes exactly four engine conversations: probe (`docker
//! info`), discovery (`docker ps` + `docker inspect`), and filesystem reads
//! (`docker cp … -` tar streams). There is deliberately **no** write, delete,
//! exec-of-arbitrary-argv, LSP or Git surface: those are DC1b policy
//! decisions, not accidental omissions. Unsupported operations are refused
//! with typed errors ([`ContainerError::CapabilityRefused`]), never silently
//! approximated.
//!
//! # Ownership and identity
//!
//! - Attaching never transfers lifecycle ownership: nothing here creates,
//! stops, restarts or removes a container, and no local path is ever
//! touched — a container path is not aliased to an analogous host path.
//! - The engine is the **local** Docker CLI only (argv arrays, never shell
//! strings). Remote engines are DC5; no SSH daemon inside the container
//! is required or used.
//! - Identity is the canonical 64-hex inspect id plus the incarnation
//! (`State.StartedAt`), never a container name alone. A name that
//! re-resolves to a different id is a stale-identity refusal; a container
//! that restarts between inspect and read is detected by a cheap
//! `started_at` re-check before every read.
//!
//! # Process policy
//!
//! Every `docker` invocation runs through `strop_core::process`
//! supervision: an [`OwnedProcess`](strop_core::process::OwnedProcess)
//! process group, the caller's [`CancelToken`], a wall-clock deadline and
//! bounded pipe retention. Directory listings stream the tar archive
//! through an incremental parser that retains only direct-child metadata,
//! so a subtree's bulk bounds the transfer, never the memory; a listing
//! whose retained metadata overflows its bound is refused, and file reads
//! truncate by explicit `max` semantics — nothing partial is ever
//! presented as complete.
pub use ;
pub use ContainerError;
pub use ;
pub use ;
pub use ;