mirror of
https://github.com/jlengrand/engine.git
synced 2026-03-10 08:11:21 +00:00
fix: clean docker images when there is not enough space left
This commit is contained in:
committed by
Pierre Mavro
parent
0cf375d1b5
commit
a6ae7d9b67
11
Cargo.lock
generated
11
Cargo.lock
generated
@@ -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",
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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());
|
||||
},
|
||||
)
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user