Merge pull request #8523 from dokku/3826-extending-resource-management-to-include-build-containers

Support resource limits on the build container
This commit is contained in:
Jose Diaz-Gonzalez
2026-04-29 10:45:16 -04:00
committed by GitHub
7 changed files with 285 additions and 6 deletions

View File

@@ -141,6 +141,28 @@ trigger-builder-dockerfile-builder-build() {
DOCKERFILE_ARGS+=("--label" "${1#--label=}")
shift 1
;;
--memory | -m)
DOCKERFILE_ARGS+=("--memory")
DOCKERFILE_ARGS+=("$2")
shift 2
;;
--memory=* | -m=*)
if [[ "$1" == "--memory=*" ]]; then
DOCKERFILE_ARGS+=("--memory" "${1#--memory=}")
elif [[ "$1" == "-m=*" ]]; then
DOCKERFILE_ARGS+=("--memory" "${1#-m=}")
fi
shift 1
;;
--memory-swap)
DOCKERFILE_ARGS+=("--memory-swap")
DOCKERFILE_ARGS+=("$2")
shift 2
;;
--memory-swap=*)
DOCKERFILE_ARGS+=("--memory-swap" "${1#--memory-swap=}")
shift 1
;;
--network)
DOCKERFILE_ARGS+=("--network")
DOCKERFILE_ARGS+=("$2")
@@ -205,7 +227,7 @@ trigger-builder-dockerfile-builder-build() {
shift 1
;;
--ssh)
DOCKERFILE_ARGS+=("--platform")
DOCKERFILE_ARGS+=("--ssh")
DOCKERFILE_ARGS+=("$2")
shift 2
;;
@@ -213,6 +235,15 @@ trigger-builder-dockerfile-builder-build() {
DOCKERFILE_ARGS+=("--ssh" "${1#--ssh=}")
shift 1
;;
--tag)
DOCKERFILE_ARGS+=("--tag")
DOCKERFILE_ARGS+=("$2")
shift 2
;;
--tag=*)
DOCKERFILE_ARGS+=("--tag" "${1#--tag=}")
shift 1
;;
--target)
DOCKERFILE_ARGS+=("--target")
DOCKERFILE_ARGS+=("$2")
@@ -223,12 +254,12 @@ trigger-builder-dockerfile-builder-build() {
shift 1
;;
--ulimit)
DOCKERFILE_ARGS+=("--tag")
DOCKERFILE_ARGS+=("--ulimit")
DOCKERFILE_ARGS+=("$2")
shift 2
;;
--tag=*)
DOCKERFILE_ARGS+=("--tag" "${1#--tag=}")
--ulimit=*)
DOCKERFILE_ARGS+=("--ulimit" "${1#--ulimit=}")
shift 1
;;
--check | -D | --debug | --no-cache)

View File

@@ -5,6 +5,7 @@
/install
/post-*
/report
/docker-args-process-build
/docker-args-process-deploy
/docker-args-process-run
/resource-get-property

View File

@@ -1,5 +1,5 @@
SUBCOMMANDS = subcommands/limit subcommands/limit-clear subcommands/report subcommands/reserve subcommands/reserve-clear
TRIGGERS = triggers/docker-args-process-deploy triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/report triggers/resource-get-property
TRIGGERS = triggers/docker-args-process-build triggers/docker-args-process-deploy triggers/install triggers/post-app-clone-setup triggers/post-app-rename-setup triggers/post-delete triggers/report triggers/resource-get-property
BUILD = commands subcommands triggers
PLUGIN_NAME = resource

View File

@@ -18,6 +18,10 @@ func main() {
var err error
switch trigger {
case "docker-args-process-build":
appName := flag.Arg(0)
builderType := flag.Arg(1)
err = resource.TriggerDockerArgsProcessBuild(appName, builderType)
case "docker-args-process-deploy":
appName := flag.Arg(0)
processType := flag.Arg(3)

View File

@@ -91,6 +91,84 @@ func TriggerDockerArgsProcessDeploy(appName string, processType string) error {
return nil
}
// TriggerDockerArgsProcessBuild outputs build-phase docker options for a builder
func TriggerDockerArgsProcessBuild(appName string, builderType string) error {
stdin, err := io.ReadAll(os.Stdin)
if err != nil {
return err
}
if os.Getenv("DOKKU_OMIT_RESOURCE_ARGS") == "1" {
fmt.Print(string(stdin))
return nil
}
allowed := validBuildLimitsForBuilder(builderType)
if len(allowed) == 0 {
fmt.Print(string(stdin))
return nil
}
resources, err := common.PropertyGetAll("resource", appName)
if err != nil {
fmt.Print(string(stdin))
return nil
}
limits := make(map[string]string)
prefix := "build.limit."
for key, value := range resources {
if !strings.HasPrefix(key, prefix) {
continue
}
resourceKey := strings.TrimPrefix(key, prefix)
if !allowed[resourceKey] {
continue
}
flagName := resourceKey
if resourceKey == "cpu" {
flagName = "cpus"
}
if resourceKey == "nvidia-gpu" {
flagName = "gpus"
}
limits[flagName] = value
}
for key, value := range limits {
if value == "" {
continue
}
value = addMemorySuffixForDocker(key, value)
fmt.Printf(" --%s=%s ", key, value)
}
fmt.Print(string(stdin))
return nil
}
// validBuildLimitsForBuilder returns the resource keys (in property-key form)
// that the named builder can apply during the build phase. An empty map means
// the builder does not support build-phase resource limits.
func validBuildLimitsForBuilder(builderType string) map[string]bool {
switch builderType {
case "herokuish":
return map[string]bool{
"cpu": true,
"memory": true,
"memory-swap": true,
"nvidia-gpu": true,
}
case "dockerfile":
return map[string]bool{
"memory": true,
"memory-swap": true,
}
}
return nil
}
// TriggerInstall runs the install step for the resource plugin
func TriggerInstall() error {
if err := common.PropertySetup("resource"); err != nil {