From 0da26e37d521cc9fe6ea14c1545342cdac43b7b9 Mon Sep 17 00:00:00 2001 From: Gerald Pinder Date: Thu, 6 Feb 2025 13:18:42 -0500 Subject: [PATCH] fix: Check for buildx before using docker --- process/drivers/docker_driver.rs | 11 +++++++++++ process/drivers/types.rs | 9 +++++++-- 2 files changed, 18 insertions(+), 2 deletions(-) diff --git a/process/drivers/docker_driver.rs b/process/drivers/docker_driver.rs index 3678a82..4309f76 100644 --- a/process/drivers/docker_driver.rs +++ b/process/drivers/docker_driver.rs @@ -57,6 +57,10 @@ impl DockerDriver { fn setup() -> Result<()> { trace!("DockerDriver::setup()"); + if !Self::has_buildx() { + bail!("Docker Buildx is required to use the Docker driver"); + } + let mut lock = DOCKER_SETUP.lock().expect("Should lock"); if *lock { @@ -105,6 +109,13 @@ impl DockerDriver { drop(lock); Ok(()) } + + #[must_use] + pub fn has_buildx() -> bool { + pipe!(cmd!("docker", "--help") | cmd!("grep", "buildx")) + .status() + .is_ok_and(|status| status.success()) + } } impl DriverVersion for DockerDriver { diff --git a/process/drivers/types.rs b/process/drivers/types.rs index d76731d..bb0df67 100644 --- a/process/drivers/types.rs +++ b/process/drivers/types.rs @@ -58,7 +58,9 @@ impl DetermineDriver for Option { blue_build_utils::check_command_exists("podman"), blue_build_utils::check_command_exists("buildah"), ) { - (Ok(_docker), _, _) if DockerDriver::is_supported_version() => { + (Ok(_docker), _, _) + if DockerDriver::is_supported_version() && DockerDriver::has_buildx() => + { BuildDriverType::Docker } (_, Ok(_podman), _) if PodmanDriver::is_supported_version() => { @@ -70,7 +72,10 @@ impl DetermineDriver for Option { _ => panic!( "{}{}{}{}", "Could not determine strategy, ", - format_args!("need either docker version {}, ", DockerDriver::VERSION_REQ,), + format_args!( + "need either docker version {} with buildx, ", + DockerDriver::VERSION_REQ, + ), format_args!("podman version {}, ", PodmanDriver::VERSION_REQ,), format_args!( "or buildah version {} to continue",