fix: clean docker images when there is not enough space left

This commit is contained in:
Pierre Mavro
2020-12-13 21:38:56 +01:00
committed by Pierre Mavro
parent 0cf375d1b5
commit a6ae7d9b67
3 changed files with 55 additions and 1 deletions

11
Cargo.lock generated
View File

@@ -613,6 +613,16 @@ version = "0.1.1"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "00b0228411908ca8685dba7fc2cdd70ec9990a6e753e89b6ac91a84c40fbaf4b"
[[package]]
name = "fs2"
version = "0.4.3"
source = "registry+https://github.com/rust-lang/crates.io-index"
checksum = "9564fc758e15025b46aa6643b1b77d047d1a56a1aea6e01002ac0c7026876213"
dependencies = [
"libc",
"winapi 0.3.9",
]
[[package]]
name = "fuchsia-cprng"
version = "0.1.1"
@@ -1724,6 +1734,7 @@ dependencies = [
"dirs 3.0.1",
"dns-lookup",
"flate2",
"fs2",
"futures 0.3.7",
"gethostname",
"git2",

View File

@@ -34,6 +34,9 @@ tracing-subscriber = "0.2"
# Docker deps
# shiplift = "0.6.0"
# Filesystem
fs2 = "0.4.3"
# Jinja2
tera = "1.3.1"
serde = "1.0.114"

View File

@@ -2,7 +2,7 @@ use std::path::Path;
use std::rc::Rc;
use crate::build_platform::{Build, BuildPlatform, BuildResult, Image, Kind};
use crate::error::{EngineError, EngineErrorCause};
use crate::error::{EngineError, EngineErrorCause, SimpleError};
use crate::fs::workspace_directory;
use crate::git::checkout_submodules;
use crate::models::{
@@ -10,6 +10,8 @@ use crate::models::{
ProgressScope,
};
use crate::{cmd, git};
use fs2::FsStats;
use futures::io::Error;
/// use Docker in local
pub struct LocalDocker {
@@ -228,6 +230,25 @@ impl BuildPlatform for LocalDocker {
None => vec![],
};
// ensure there is enough disk space left before building a new image
let docker_path = Path::new("/var/lib/docker");
let docker_path_size_info = fs2::statvfs(docker_path).unwrap();
let docker_max_disk_percentage_usage_before_purge = 50; // arbitrary percentage that should make the job anytime
let docker_percentage_used =
docker_path_size_info.available_space() * 100 / docker_path_size_info.total_space();
if docker_percentage_used > docker_max_disk_percentage_usage_before_purge {
warn!(
"Docker disk usage is higher than {}%, requesting cleaning",
docker_max_disk_percentage_usage_before_purge
);
match docker_prune_images(envs.clone()) {
Err(e) => error!("error while purging docker images: {:?}", e.message),
_ => info!("docker images have been purged"),
};
};
// docker build
let exit_status = cmd::utilities::exec_with_envs_and_output(
"docker",
@@ -314,3 +335,22 @@ impl BuildPlatform for LocalDocker {
Err(self.engine_error(EngineErrorCause::Internal, message))
}
}
pub fn docker_prune_images(envs: Vec<(&str, &str)>) -> Result<(), SimpleError> {
let mut docker_args = vec!["image", "prune", "-a", "-f"];
let envs = Vec::new();
cmd::utilities::exec_with_envs_and_output(
"docker",
docker_args,
envs,
|line| {
let line_string = line.unwrap();
debug!("{}", line_string.as_str());
},
|line| {
let line_string = line.unwrap();
debug!("{}", line_string.as_str());
},
)
}