Skip to main content

libcontainer/container/
container_pause.rs

1use libcgroups::common::{CgroupManager, FreezerState};
2
3use super::{Container, ContainerStatus};
4use crate::error::LibcontainerError;
5
6impl Container {
7    /// Suspends all processes within the container
8    ///
9    /// # Example
10    ///
11    /// ```no_run
12    /// use libcontainer::container::builder::ContainerBuilder;
13    /// use libcontainer::syscall::syscall::SyscallType;
14    ///
15    /// # fn main() -> anyhow::Result<()> {
16    /// let mut container = ContainerBuilder::new(
17    ///     "74f1a4cb3801".to_owned(),
18    ///     SyscallType::default(),
19    /// )
20    /// .as_init("/var/run/docker/bundle")
21    /// .build()?;
22    ///
23    /// container.pause()?;
24    /// # Ok(())
25    /// # }
26    /// ```
27    pub fn pause(&mut self) -> Result<(), LibcontainerError> {
28        self.refresh_status()?;
29
30        if !self.can_pause() {
31            tracing::error!(status = ?self.status(), id = ?self.id(), "cannot pause container");
32            return Err(LibcontainerError::IncorrectStatus(self.status()));
33        }
34
35        let cmanager =
36            libcgroups::common::create_cgroup_manager(libcgroups::common::CgroupConfig {
37                cgroup_path: self.spec()?.cgroup_path,
38                systemd_cgroup: self.systemd(),
39                container_name: self.id().to_string(),
40            })?;
41        cmanager.freeze(FreezerState::Frozen)?;
42
43        tracing::debug!("saving paused status");
44        self.set_status(ContainerStatus::Paused).save()?;
45
46        tracing::debug!("container {} paused", self.id());
47        Ok(())
48    }
49}