add date option
This commit is contained in:
parent
03cb8fdf3c
commit
d9821ae3de
71
src/main.rs
71
src/main.rs
|
@ -11,23 +11,21 @@ use std::{
|
||||||
};
|
};
|
||||||
|
|
||||||
const DOCKER_BIN: &str = "docker";
|
const DOCKER_BIN: &str = "docker";
|
||||||
const DOCKER_IMGS_CMD: [&str; 1] = ["images"];
|
|
||||||
const DOCKER_FORMAT_ARGS: [&str; 2] = ["--format", "{{json .}}"];
|
|
||||||
const DOCKER_RMI_CMD: [&str; 1] = ["rmi"];
|
|
||||||
const DAYS_RM: u32 = 2;
|
|
||||||
|
|
||||||
/// Clear docker images from
|
/// Clear docker images from
|
||||||
#[derive(Parser, Debug)]
|
#[derive(Parser, Debug)]
|
||||||
#[clap(author, version, about, long_about = None)]
|
#[clap(author, version, about, long_about = None)]
|
||||||
struct Args {
|
struct Args {
|
||||||
#[clap(short, long, takes_value = false)]
|
/// filter by repository name (ISO 8601) [default: $NOW - 2 days]
|
||||||
verbose: bool,
|
#[clap(short, long)]
|
||||||
|
date: Option<DateTime<Utc>>,
|
||||||
|
|
||||||
/// filter by repository name
|
/// filter by repository name
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
repository: Option<String>,
|
repository: Option<String>,
|
||||||
|
|
||||||
/// add tags exclusion
|
/// add tags exclusion
|
||||||
|
/// Example: -t 1.1.0 -t release
|
||||||
#[clap(short, long)]
|
#[clap(short, long)]
|
||||||
tags: Option<Vec<String>>,
|
tags: Option<Vec<String>>,
|
||||||
|
|
||||||
|
@ -38,6 +36,10 @@ struct Args {
|
||||||
/// should docker force image removal (it may create orphan images)
|
/// should docker force image removal (it may create orphan images)
|
||||||
#[clap(long, takes_value = false)]
|
#[clap(long, takes_value = false)]
|
||||||
force: bool,
|
force: bool,
|
||||||
|
|
||||||
|
/// add more logs
|
||||||
|
#[clap(short, long, takes_value = false)]
|
||||||
|
verbose: bool,
|
||||||
}
|
}
|
||||||
|
|
||||||
#[derive(Deserialize, Debug)]
|
#[derive(Deserialize, Debug)]
|
||||||
|
@ -55,26 +57,7 @@ struct Image {
|
||||||
fn main() {
|
fn main() {
|
||||||
let args = Args::parse();
|
let args = Args::parse();
|
||||||
|
|
||||||
let mut cmd = Command::new(DOCKER_BIN);
|
let stdout = get_images(args.repository);
|
||||||
cmd.args(DOCKER_IMGS_CMD);
|
|
||||||
|
|
||||||
if let Some(repo) = args.repository {
|
|
||||||
cmd.arg(repo);
|
|
||||||
}
|
|
||||||
|
|
||||||
cmd.args(DOCKER_FORMAT_ARGS);
|
|
||||||
|
|
||||||
let stdout = match cmd.output() {
|
|
||||||
Ok(o) => {
|
|
||||||
if !o.status.success() {
|
|
||||||
eprintln!("{}", std::str::from_utf8(&o.stderr).unwrap());
|
|
||||||
return eprintln!("failed to retrieve docker images. Please checkout STDERR");
|
|
||||||
}
|
|
||||||
|
|
||||||
o.stdout
|
|
||||||
}
|
|
||||||
Err(e) => return eprintln!("docker command failed: {}", e),
|
|
||||||
};
|
|
||||||
|
|
||||||
let s_data = std::str::from_utf8(&stdout).unwrap();
|
let s_data = std::str::from_utf8(&stdout).unwrap();
|
||||||
let mut images: Vec<&str> = s_data.split("\n").collect();
|
let mut images: Vec<&str> = s_data.split("\n").collect();
|
||||||
|
@ -87,7 +70,12 @@ fn main() {
|
||||||
}
|
}
|
||||||
|
|
||||||
let now = Utc::now();
|
let now = Utc::now();
|
||||||
let past_date = get_past_date(now.year(), now.month(), now.day(), DAYS_RM).and_hms(1, 0, 0);
|
let past_date = if let Some(date) = args.date {
|
||||||
|
date
|
||||||
|
} else {
|
||||||
|
get_past_date(now.year(), now.month(), now.day(), 2).and_hms(1, 0, 0)
|
||||||
|
};
|
||||||
|
|
||||||
let tags = if let Some(t) = args.tags { t } else { vec![] };
|
let tags = if let Some(t) = args.tags { t } else { vec![] };
|
||||||
let mut ids = vec![];
|
let mut ids = vec![];
|
||||||
let mut saved_size: f32 = 0.0;
|
let mut saved_size: f32 = 0.0;
|
||||||
|
@ -130,7 +118,7 @@ fn main() {
|
||||||
println!("dry run activated");
|
println!("dry run activated");
|
||||||
} else {
|
} else {
|
||||||
let mut cmd = Command::new(DOCKER_BIN);
|
let mut cmd = Command::new(DOCKER_BIN);
|
||||||
cmd.args(DOCKER_RMI_CMD);
|
cmd.arg("rmi");
|
||||||
|
|
||||||
if args.force {
|
if args.force {
|
||||||
println!("\"--force\" flag set");
|
println!("\"--force\" flag set");
|
||||||
|
@ -171,6 +159,33 @@ fn main() {
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fn get_images(repo: Option<String>) -> Vec<u8> {
|
||||||
|
let mut cmd = Command::new(DOCKER_BIN);
|
||||||
|
cmd.arg("images");
|
||||||
|
|
||||||
|
if let Some(repo) = repo {
|
||||||
|
cmd.arg(repo);
|
||||||
|
}
|
||||||
|
|
||||||
|
cmd.args(["--format", "{{json .}}"]);
|
||||||
|
|
||||||
|
match cmd.output() {
|
||||||
|
Ok(o) => {
|
||||||
|
if !o.status.success() {
|
||||||
|
eprintln!("{}", std::str::from_utf8(&o.stderr).unwrap());
|
||||||
|
eprintln!("failed to retrieve docker images. Please checkout STDERR");
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
|
||||||
|
o.stdout
|
||||||
|
}
|
||||||
|
Err(e) => {
|
||||||
|
eprintln!("docker command failed: {}", e);
|
||||||
|
exit(1);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
fn failed_convert_size(e: ParseFloatError) -> f32 {
|
fn failed_convert_size(e: ParseFloatError) -> f32 {
|
||||||
eprintln!("failed to convert \"String\" to \"f32\": {}", e);
|
eprintln!("failed to convert \"String\" to \"f32\": {}", e);
|
||||||
exit(1);
|
exit(1);
|
||||||
|
|
Reference in New Issue