This repository has been archived on 2024-03-03. You can view files and clone it, but cannot push or open issues or pull requests.
clear-docker-images/src/main.rs

92 lines
2.3 KiB
Rust
Raw Normal View History

2022-02-08 13:50:34 +01:00
mod date;
2022-02-20 23:06:15 +01:00
mod images;
2022-02-08 13:50:34 +01:00
use clap::Parser;
2022-02-20 23:06:15 +01:00
use std::process::{Command, Stdio};
use crate::images::process_imgs;
2022-02-08 13:50:34 +01:00
const DOCKER_BIN: &str = "docker";
/// Clear docker images from
#[derive(Parser, Debug)]
#[clap(author, version, about, long_about = None)]
struct Args {
2022-02-20 16:59:06 +01:00
/// filter by date.
///
2022-02-20 18:39:10 +01:00
/// Can filter by a minimum age $DATE or from $FROM|$TO (format example: YYYY-MM-DD or YYYY-MM-DDTHH:MM:SS) [default: $NOW - 2 days]
2022-02-17 21:00:08 +01:00
#[clap(short, long)]
2022-02-20 16:59:06 +01:00
date: Option<String>,
2022-02-17 20:28:39 +01:00
2022-02-08 16:24:20 +01:00
/// filter by repository name
2022-02-08 13:50:34 +01:00
#[clap(short, long)]
repository: Option<String>,
2022-02-08 16:24:20 +01:00
/// add tags exclusion
#[clap(short, long)]
tags: Option<Vec<String>>,
2022-02-20 16:59:06 +01:00
/// image cleanup will not be triggered [default: false]
2022-02-08 13:50:34 +01:00
#[clap(long, takes_value = false)]
dry_run: bool,
2022-02-08 16:24:20 +01:00
2022-02-20 16:59:06 +01:00
/// force image removal [default: false]
2022-02-08 16:24:20 +01:00
#[clap(long, takes_value = false)]
force: bool,
2022-02-17 21:00:08 +01:00
2022-02-20 16:59:06 +01:00
/// add more logs [default: false]
2022-02-17 21:00:08 +01:00
#[clap(short, long, takes_value = false)]
verbose: bool,
2022-02-08 13:50:34 +01:00
}
fn main() {
let args = Args::parse();
2022-03-05 16:25:59 +01:00
let tags = args.tags.map_or(vec![], |tags| tags);
2022-02-20 23:06:15 +01:00
let (ids, saved_size) = process_imgs(args.repository, tags, args.date);
2022-02-08 13:50:34 +01:00
if args.dry_run {
println!("dry run activated");
} else {
2022-02-08 16:24:20 +01:00
let mut cmd = Command::new(DOCKER_BIN);
2022-02-17 21:00:08 +01:00
cmd.arg("rmi");
2022-02-08 16:29:54 +01:00
2022-02-08 16:24:20 +01:00
if args.force {
2022-02-17 20:28:39 +01:00
println!("\"--force\" flag set");
2022-02-08 16:29:54 +01:00
cmd.arg("--force");
}
if ids.len() == 0 {
2022-02-17 20:28:39 +01:00
println!("nothing to do...");
return;
}
if args.verbose {
println!("trigger \"docker rmi\" command");
2022-02-08 16:24:20 +01:00
}
2022-02-08 16:29:54 +01:00
match cmd.args(&ids).stdout(Stdio::null()).status() {
2022-02-08 13:50:34 +01:00
Ok(s) => {
if !s.success() {
eprintln!("failed to delete images. Please checkout STDERR")
}
println!("images deleted!")
}
Err(e) => eprintln!("docker command failed: {}", e),
};
}
2022-02-17 20:28:39 +01:00
if args.verbose || args.dry_run {
println!("deleted images: {:#?}", ids);
}
println!(
"Total disk space saved: {}",
if saved_size / 1000 as f32 > 1 as f32 {
format!("{:.2}GB", saved_size / 1000.0)
} else {
format!("{:.2}MB", saved_size)
}
);
}