From 34a07ba3c14f805607030109593f244f63c68175 Mon Sep 17 00:00:00 2001 From: Mark Kovari Date: Fri, 26 Jan 2024 13:21:57 +0100 Subject: [PATCH] feat(container): add optional ingored_prefixes to ignore multiple tags --- config.example.toml | 1 + src/config.rs | 8 ++++++++ src/steps/containers.rs | 24 +++++++++++++++++++++--- 3 files changed, 30 insertions(+), 3 deletions(-) diff --git a/config.example.toml b/config.example.toml index cb31dadb..1e5dd1f0 100644 --- a/config.example.toml +++ b/config.example.toml @@ -230,3 +230,4 @@ # containers = ["archlinux-latest"] [containers] # ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest"] +# ingored_prefixes = ["rancher/"] diff --git a/src/config.rs b/src/config.rs index b5992ddb..8870e582 100644 --- a/src/config.rs +++ b/src/config.rs @@ -165,6 +165,7 @@ pub struct Include { pub struct Containers { #[merge(strategy = crate::utils::merge_strategies::vec_prepend_opt)] ignored_containers: Option>, + ignored_prefixes: Option>, } #[derive(Deserialize, Default, Debug, Merge)] @@ -853,6 +854,13 @@ impl Config { self.config_file.git.as_ref().and_then(|git| git.repos.as_ref()) } + /// The list of docker/podman container prefixes to ignore. + pub fn containers_ignored_prefixes(&self) -> Option<&Vec> { + self.config_file + .containers + .as_ref() + .and_then(|containers| containers.ignored_prefixes.as_ref()) + } /// The list of docker/podman containers to ignore. pub fn containers_ignored_tags(&self) -> Option<&Vec> { self.config_file diff --git a/src/steps/containers.rs b/src/steps/containers.rs index 5a56d09e..d4c87bd4 100644 --- a/src/steps/containers.rs +++ b/src/steps/containers.rs @@ -50,7 +50,11 @@ impl Display for Container { /// "REGISTRY/[PATH/]CONTAINER_NAME:TAG" /// /// Containers specified in `ignored_containers` will be filtered out. -fn list_containers(crt: &Path, ignored_containers: Option<&Vec>) -> Result> { +fn list_containers( + crt: &Path, + ignored_containers: Option<&Vec>, + ignored_prefixes: Option<&Vec>, +) -> Result> { debug!( "Querying '{} image ls --format \"{{{{.Repository}}}}:{{{{.Tag}}}}/{{{{.ID}}}}\"' for containers", crt.display() @@ -85,6 +89,16 @@ fn list_containers(crt: &Path, ignored_containers: Option<&Vec>) -> Resu assert_eq!(split_res.len(), 2); let (repo_tag, image_id) = (split_res[0], split_res[1]); + if let Some(ignored_prefixes) = ignored_prefixes { + if ignored_prefixes + .iter() + .any(|ignored_prefix| repo_tag.starts_with(ignored_prefix)) + { + debug!("Skipping ignored container '{}' due to a matching prefix", line); + continue; + } + } + if let Some(ignored_containers) = ignored_containers { if ignored_containers .iter() @@ -121,8 +135,12 @@ pub fn run_containers(ctx: &ExecutionContext) -> Result<()> { print_separator("Containers"); let mut success = true; - let containers = - list_containers(&crt, ctx.config().containers_ignored_tags()).context("Failed to list Docker containers")?; + let containers = list_containers( + &crt, + ctx.config().containers_ignored_tags(), + ctx.config().containers_ignored_prefixes(), + ) + .context("Failed to list Docker containers")?; debug!("Containers to inspect: {:?}", containers); for container in containers.iter() {