From a15e6748c721439bb970e92a28a323faea976375 Mon Sep 17 00:00:00 2001 From: Jakob Fels Date: Fri, 24 Nov 2023 09:44:52 +0100 Subject: [PATCH] Add option to ignore containers to pull (#613) --- config.example.toml | 2 ++ src/config.rs | 18 ++++++++++++++++++ src/steps/containers.rs | 17 +++++++++++++++-- 3 files changed, 35 insertions(+), 2 deletions(-) diff --git a/config.example.toml b/config.example.toml index 7c21a120..8d804dee 100644 --- a/config.example.toml +++ b/config.example.toml @@ -223,3 +223,5 @@ # use_root = false # containers = ["archlinux-latest"] +[containers] +# ignored_containers = ["ghcr.io/rancher-sandbox/rancher-desktop/rdx-proxy:latest"] diff --git a/src/config.rs b/src/config.rs index 7d135ea4..2be9f2d0 100644 --- a/src/config.rs +++ b/src/config.rs @@ -159,6 +159,13 @@ pub struct Include { paths: Option>, } +#[derive(Deserialize, Default, Debug, Merge)] +#[serde(deny_unknown_fields)] +pub struct Containers { + #[merge(strategy = crate::utils::merge_strategies::vec_prepend_opt)] + ignored_containers: Option>, +} + #[derive(Deserialize, Default, Debug, Merge)] #[serde(deny_unknown_fields)] pub struct Git { @@ -411,6 +418,9 @@ pub struct ConfigFile { #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] git: Option, + #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] + containers: Option, + #[merge(strategy = crate::utils::merge_strategies::inner_merge_opt)] windows: Option, @@ -842,6 +852,14 @@ impl Config { self.config_file.git.as_ref().and_then(|git| git.repos.as_ref()) } + /// The list of docker/podman containers to ignore. + pub fn containers_ignored_tags(&self) -> Option<&Vec> { + self.config_file + .containers + .as_ref() + .and_then(|containers| containers.ignored_containers.as_ref()) + } + /// Tell whether the specified step should run. /// /// If the step appears either in the `--disable` command line argument diff --git a/src/steps/containers.rs b/src/steps/containers.rs index d5cf2e80..5a56d09e 100644 --- a/src/steps/containers.rs +++ b/src/steps/containers.rs @@ -48,7 +48,9 @@ impl Display for Container { /// Returns a Vector of all containers, with Strings in the format /// "REGISTRY/[PATH/]CONTAINER_NAME:TAG" -fn list_containers(crt: &Path) -> Result> { +/// +/// Containers specified in `ignored_containers` will be filtered out. +fn list_containers(crt: &Path, ignored_containers: Option<&Vec>) -> Result> { debug!( "Querying '{} image ls --format \"{{{{.Repository}}}}:{{{{.Tag}}}}/{{{{.ID}}}}\"' for containers", crt.display() @@ -83,6 +85,16 @@ fn list_containers(crt: &Path) -> Result> { assert_eq!(split_res.len(), 2); let (repo_tag, image_id) = (split_res[0], split_res[1]); + if let Some(ignored_containers) = ignored_containers { + if ignored_containers + .iter() + .any(|ignored_container| repo_tag.eq(ignored_container)) + { + debug!("Skipping ignored container '{}'", line); + continue; + } + } + debug!( "Querying '{} image inspect --format \"{{{{.Os}}}}/{{{{.Architecture}}}}\"' for container {}", crt.display(), @@ -109,7 +121,8 @@ pub fn run_containers(ctx: &ExecutionContext) -> Result<()> { print_separator("Containers"); let mut success = true; - let containers = list_containers(&crt).context("Failed to list Docker containers")?; + let containers = + list_containers(&crt, ctx.config().containers_ignored_tags()).context("Failed to list Docker containers")?; debug!("Containers to inspect: {:?}", containers); for container in containers.iter() {