//! Create and manage containers.
//!
//! API Reference: <https://docs.docker.com/engine/api/v1.41/#tag/Container>
use std::{collections::HashMap, hash::Hash, io, iter::Peekable, path::Path, time::Duration};
use futures_util::{
io::{AsyncRead, AsyncWrite},
stream::Stream,
TryStreamExt,
};
use hyper::Body;
use mime::Mime;
use serde::Serialize;
use serde_json::{json, Map, Value};
use url::form_urlencoded;
use crate::{
docker::Docker,
errors::{Error, Result},
exec::{Exec, ExecContainerOptions},
rep::{
Change, Container as ContainerInfo, ContainerCreateInfo, ContainerDetails, Exit, Stats, Top,
},
transport::Payload,
tty::{self, Multiplexer as TtyMultiPlexer},
};
/// Interface for accessing and manipulating a docker container
pub struct Container<'docker> {
docker: &'docker Docker,
id: String,
}
impl<'docker> Container<'docker> {
/// Exports an interface exposing operations against a container instance
pub fn new<S>(
docker: &'docker Docker,
id: S,
) -> Self
where
S: Into<String>,
{
Container {
docker,
id: id.into(),
}
}
/// a getter for the container id
pub fn id(&self) -> &str {
&self.id
}
/// Inspects the current docker container instance's details
pub async fn inspect(&self) -> Result<ContainerDetails> {
self.docker
.get_json::<ContainerDetails>(&format!("/containers/{}/json", self.id)[..])
.await
}
/// Returns a `top` view of information about the container process
pub async fn top(
&self,
psargs: Option<&str>,
) -> Result<Top> {
let mut path = vec![format!("/containers/{}/top", self.id)];
if let Some(ref args) = psargs {
let encoded = form_urlencoded::Serializer::new(String::new())
.append_pair("ps_args"