From a85160e4d6e55399123ff43ae2710c0719e095d2 Mon Sep 17 00:00:00 2001 From: Mikhail Malyshev Date: Thu, 26 Feb 2026 08:20:29 +0000 Subject: [PATCH] pkg build: make buildkit builder container name configurable On shared servers where multiple users build packages against the same Docker daemon, all users fight over a single hardcoded builder container named "linuxkit-builder". One user's build can destroy another's in-flight build when builder lifecycle management detects mismatches. Make the builder container name configurable: 1. --builder-name CLI flag (highest priority) 2. LINUXKIT_BUILDER_NAME environment variable 3. "linuxkit-builder" default (original behavior, unchanged) The flag is available on both "linuxkit pkg build" and "linuxkit pkg builder" (du/prune) commands. Users on shared servers can set LINUXKIT_BUILDER_NAME or pass --builder-name to get per-user isolation (e.g. LINUXKIT_BUILDER_NAME=linuxkit-builder-$USER). Signed-off-by: Mikhail Malyshev --- src/cmd/linuxkit/pkg_build.go | 4 ++++ src/cmd/linuxkit/pkg_builder.go | 3 +++ src/cmd/linuxkit/pkglib/dockerimpl.go | 7 ++++++- 3 files changed, 13 insertions(+), 1 deletion(-) diff --git a/src/cmd/linuxkit/pkg_build.go b/src/cmd/linuxkit/pkg_build.go index c0b719cdc..43c9b57ce 100644 --- a/src/cmd/linuxkit/pkg_build.go +++ b/src/cmd/linuxkit/pkg_build.go @@ -16,6 +16,7 @@ import ( const ( buildersEnvVar = "LINUXKIT_BUILDERS" envVarCacheDir = "LINUXKIT_CACHE" + envVarBuilderName = "LINUXKIT_BUILDER_NAME" defaultBuilderImage = "moby/buildkit:v0.26.3" ) @@ -40,6 +41,7 @@ func pkgBuildCmd() *cobra.Command { platforms string skipPlatforms string builders string + builderName = flagOverEnvVarOverDefaultString{def: pkglib.DefaultBuilderName(), envVar: envVarBuilderName} builderImage string builderConfig string builderRestart bool @@ -199,6 +201,7 @@ func pkgBuildCmd() *cobra.Command { opts = append(opts, pkglib.WithBuildBuilders(buildersMap)) opts = append(opts, pkglib.WithBuildBuilderConfig(pkglib.BuilderConfig{ + Name: builderName.String(), Image: builderImage, ConfigPath: builderConfig, Restart: builderRestart, @@ -305,6 +308,7 @@ func pkgBuildCmd() *cobra.Command { cmd.Flags().StringVar(&platforms, "platforms", "", "Which platforms to build for, defaults to all of those for which the package can be built") cmd.Flags().StringVar(&skipPlatforms, "skip-platforms", "", "Platforms that should be skipped, even if present in build.yml") cmd.Flags().StringVar(&builders, "builders", "", "Which builders to use for which platforms, e.g. linux/arm64=docker-context-arm64, overrides defaults and environment variables, see https://github.com/linuxkit/linuxkit/blob/master/docs/packages.md#Providing-native-builder-nodes") + cmd.Flags().Var(&builderName, "builder-name", fmt.Sprintf("Name of the buildkit builder container, default: %s, overrides env var %s", pkglib.DefaultBuilderName(), envVarBuilderName)) cmd.Flags().StringVar(&builderImage, "builder-image", defaultBuilderImage, "buildkit builder container image to use") cmd.Flags().StringVar(&builderConfig, "builder-config", "", "path to buildkit builder config.toml file to use, overrides the default config.toml in the builder image. When provided, copied over into builder, along with all certs. Use paths for certificates relative to your local host, they will be adjusted on copying into the container. USE WITH CAUTION") cmd.Flags().BoolVar(&builderRestart, "builder-restart", false, "force restarting builder, even if container with correct name and image exists") diff --git a/src/cmd/linuxkit/pkg_builder.go b/src/cmd/linuxkit/pkg_builder.go index dd745f957..43a05d73a 100644 --- a/src/cmd/linuxkit/pkg_builder.go +++ b/src/cmd/linuxkit/pkg_builder.go @@ -13,6 +13,7 @@ import ( func pkgBuilderCmd() *cobra.Command { var ( builders string + builderName = flagOverEnvVarOverDefaultString{def: pkglib.DefaultBuilderName(), envVar: envVarBuilderName} platforms string builderImage string builderConfigPath string @@ -40,6 +41,7 @@ func pkgBuilderCmd() *cobra.Command { platformsToClean := strings.Split(platforms, ",") bc := pkglib.BuilderConfig{ + Name: builderName.String(), Image: builderImage, ConfigPath: builderConfigPath, } @@ -60,6 +62,7 @@ func pkgBuilderCmd() *cobra.Command { } cmd.PersistentFlags().StringVar(&builders, "builders", "", "Which builders to use for which platforms, e.g. linux/arm64=docker-context-arm64, overrides defaults and environment variables, see https://github.com/linuxkit/linuxkit/blob/master/docs/packages.md#Providing-native-builder-nodes") + cmd.PersistentFlags().Var(&builderName, "builder-name", fmt.Sprintf("Name of the buildkit builder container, default: %s, overrides env var %s", pkglib.DefaultBuilderName(), envVarBuilderName)) cmd.PersistentFlags().StringVar(&platforms, "platforms", fmt.Sprintf("linux/%s", runtime.GOARCH), "Which platforms we built images for") cmd.PersistentFlags().StringVar(&builderImage, "builder-image", defaultBuilderImage, "buildkit builder container image to use") cmd.Flags().StringVar(&builderConfigPath, "builder-config", "", "path to buildkit builder config.toml file to use, overrides the default config.toml in the builder image; USE WITH CAUTION") diff --git a/src/cmd/linuxkit/pkglib/dockerimpl.go b/src/cmd/linuxkit/pkglib/dockerimpl.go index 51762248d..4604e1212 100644 --- a/src/cmd/linuxkit/pkglib/dockerimpl.go +++ b/src/cmd/linuxkit/pkglib/dockerimpl.go @@ -67,6 +67,11 @@ const ( buildkitConfigPath = buildkitConfigDir + "/" + buildkitConfigFileName ) +// DefaultBuilderName returns the default builder container name. +func DefaultBuilderName() string { + return buildkitBuilderName +} + type dockerRunnerImpl struct { cache bool builder BuilderConfig @@ -74,7 +79,7 @@ type dockerRunnerImpl struct { func NewDockerRunner(cache bool, bc BuilderConfig) DockerRunner { if bc.Name == "" { - bc.Name = buildkitBuilderName + bc.Name = DefaultBuilderName() } return &dockerRunnerImpl{cache: cache, builder: bc} }