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:
@@ -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)
|
||||
|
||||
1
plugins/resource/.gitignore
vendored
1
plugins/resource/.gitignore
vendored
@@ -5,6 +5,7 @@
|
||||
/install
|
||||
/post-*
|
||||
/report
|
||||
/docker-args-process-build
|
||||
/docker-args-process-deploy
|
||||
/docker-args-process-run
|
||||
/resource-get-property
|
||||
|
||||
@@ -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
|
||||
|
||||
|
||||
@@ -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)
|
||||
|
||||
@@ -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 {
|
||||
|
||||
Reference in New Issue
Block a user