Skip to main content

sal_virt/nerdctl/
container_functions.rs

1// File: /root/code/git.threefold.info/herocode/sal/src/virt/nerdctl/container_functions.rs
2
3use crate::nerdctl::{execute_nerdctl_command, NerdctlError};
4use sal_process::CommandResult;
5
6/// Run a container from an image
7///
8/// # Arguments
9///
10/// * `image` - Image to run
11/// * `name` - Optional name for the container
12/// * `detach` - Whether to run in detached mode
13/// * `ports` - Optional port mappings
14/// * `snapshotter` - Optional snapshotter to use
15///
16/// # Returns
17///
18/// * `Result<CommandResult, NerdctlError>` - Command result or error
19pub fn run(
20    image: &str,
21    name: Option<&str>,
22    detach: bool,
23    ports: Option<&[&str]>,
24    snapshotter: Option<&str>,
25) -> Result<CommandResult, NerdctlError> {
26    let mut args = vec!["run"];
27
28    if detach {
29        args.push("-d");
30    }
31
32    if let Some(name_value) = name {
33        args.push("--name");
34        args.push(name_value);
35    }
36
37    if let Some(ports_value) = ports {
38        for port in ports_value {
39            args.push("-p");
40            args.push(port);
41        }
42    }
43
44    if let Some(snapshotter_value) = snapshotter {
45        args.push("--snapshotter");
46        args.push(snapshotter_value);
47    }
48
49    // Add flags to avoid BPF issues
50    args.push("--cgroup-manager=cgroupfs");
51
52    args.push(image);
53
54    execute_nerdctl_command(&args)
55}
56
57/// Execute a command in a container
58///
59/// # Arguments
60///
61/// * `container` - Container name or ID
62/// * `command` - Command to execute
63///
64/// # Returns
65///
66/// * `Result<CommandResult, NerdctlError>` - Command result or error
67pub fn exec(container: &str, command: &str) -> Result<CommandResult, NerdctlError> {
68    execute_nerdctl_command(&["exec", container, "sh", "-c", command])
69}
70
71/// Copy files between container and local filesystem
72///
73/// # Arguments
74///
75/// * `source` - Source path (can be container:path or local path)
76/// * `dest` - Destination path (can be container:path or local path)
77///
78/// # Returns
79///
80/// * `Result<CommandResult, NerdctlError>` - Command result or error
81pub fn copy(source: &str, dest: &str) -> Result<CommandResult, NerdctlError> {
82    execute_nerdctl_command(&["cp", source, dest])
83}
84
85/// Stop a container
86///
87/// # Arguments
88///
89/// * `container` - Container name or ID
90///
91/// # Returns
92///
93/// * `Result<CommandResult, NerdctlError>` - Command result or error
94pub fn stop(container: &str) -> Result<CommandResult, NerdctlError> {
95    execute_nerdctl_command(&["stop", container])
96}
97
98/// Remove a container
99///
100/// # Arguments
101///
102/// * `container` - Container name or ID
103///
104/// # Returns
105///
106/// * `Result<CommandResult, NerdctlError>` - Command result or error
107pub fn remove(container: &str) -> Result<CommandResult, NerdctlError> {
108    execute_nerdctl_command(&["rm", container])
109}
110
111/// List containers
112///
113/// # Arguments
114///
115/// * `all` - Whether to list all containers (including stopped ones)
116///
117/// # Returns
118///
119/// * `Result<CommandResult, NerdctlError>` - Command result or error
120pub fn list(all: bool) -> Result<CommandResult, NerdctlError> {
121    let mut args = vec!["ps"];
122
123    if all {
124        args.push("-a");
125    }
126
127    execute_nerdctl_command(&args)
128}
129
130/// Get container logs
131///
132/// # Arguments
133///
134/// * `container` - Container name or ID
135///
136/// # Returns
137///
138/// * `Result<CommandResult, NerdctlError>` - Command result or error
139pub fn logs(container: &str) -> Result<CommandResult, NerdctlError> {
140    execute_nerdctl_command(&["logs", container])
141}