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 <mike.malyshev@gmail.com>
This commit is contained in:
Mikhail Malyshev
2026-02-26 08:20:29 +00:00
parent ccb0787e2a
commit a85160e4d6
3 changed files with 13 additions and 1 deletions

View File

@@ -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")

View File

@@ -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")

View File

@@ -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}
}