From 57a22be2e7d5c22a828e03de14f91895c5609c60 Mon Sep 17 00:00:00 2001 From: Luke Marsden Date: Thu, 5 Feb 2026 17:42:48 +0000 Subject: [PATCH] Fix docker-shim: only inject cache flags when builder available The docker-shim was unconditionally adding --cache-from/--cache-to flags to docker build commands, even when the shared BuildKit builder wasn't available. This caused "Cache export is not supported for the docker driver" errors when using the default docker driver. Now cache flags are only injected when: 1. The shared helix-buildkit container is running 2. The helix-shared buildx builder can be created/found Without a proper builder, builds proceed normally without cache injection. Co-Authored-By: Claude Opus 4.5 --- desktop/docker-shim/docker.go | 29 +++++++++++++++++++---------- 1 file changed, 19 insertions(+), 10 deletions(-) diff --git a/desktop/docker-shim/docker.go b/desktop/docker-shim/docker.go index 8e4a3e1ed..e65895fe2 100644 --- a/desktop/docker-shim/docker.go +++ b/desktop/docker-shim/docker.go @@ -274,14 +274,15 @@ func injectBuildCacheFlags(args []string) []string { } // Build new args with builder and cache flags - cacheFrom := "--cache-from=type=local,src=" + cacheDir - cacheTo := "--cache-to=type=local,dest=" + cacheDir + ",mode=max" - + // Cache export only works with a proper buildx builder (not docker driver) + // So we only inject cache flags if we can set up the shared builder result := make([]string, 0, len(args)+4) result = append(result, args[:insertIdx]...) // Add --builder flag if shared builder is available and not already specified - if !hasBuilderFlag(args) && ensureSharedBuilder() { + // Only inject cache flags if we have a builder that supports cache export + builderAvailable := !hasBuilderFlag(args) && ensureSharedBuilder() + if builderAvailable { result = append(result, "--builder="+SharedBuilderName) // With remote builder, we need --load to get image into local docker // Check if --load or --push already specified @@ -295,16 +296,24 @@ func injectBuildCacheFlags(args []string) []string { if !hasOutput { result = append(result, "--load") } + + // Add cache flags - only when builder is available + cacheFrom := "--cache-from=type=local,src=" + cacheDir + cacheTo := "--cache-to=type=local,dest=" + cacheDir + ",mode=max" + result = append(result, cacheFrom, cacheTo) + + log.Debug(). + Str("cache_dir", cacheDir). + Str("image", imageName). + Msg("Injected BuildKit cache flags with shared builder") + } else { + log.Debug(). + Str("image", imageName). + Msg("Shared builder not available, skipping cache injection") } - result = append(result, cacheFrom, cacheTo) result = append(result, args[insertIdx:]...) - log.Debug(). - Str("cache_dir", cacheDir). - Str("image", imageName). - Msg("Injected BuildKit cache flags") - return result }