slimtoolkit/slim · error

malformed HEALTHCHECK parameters

Error message

malformed HEALTHCHECK parameters: %q

What it means

Thrown by the Dockerfile reverse-engineering parser when reconstructing a HEALTHCHECK instruction: the instruction body could not be split into the 4 required parameters (start-interval/check timing fields of the healthcheck flags). The parser splits the remainder of the HEALTHCHECK line on spaces with SplitN(..., 4) and requires all 4 parts; anything fewer means the parameters are structurally malformed, so the builder aborts with the offending data quoted.

Solutions

  1. Inspect the quoted data in the error and rewrite the HEALTHCHECK entry in image history/config metadata to the 4-parameter quoted form the parser expects.
  2. If the source image's HEALTHCHECK is shell-form, drop the HEALTHCHECK metadata or convert it to JSON/exec form before running the reverse builder.
  3. If the image is trusted and you only need the rest of the Dockerfile, pre-process the history to remove the malformed HEALTHCHECK instruction.

Example fix

// before (shell form in history)
HEALTHCHECK CMD curl -f http://localhost/ || exit 1
// after (exec/JSON form with all parameters)
HEALTHCHECK ["CMD", "curl", "-f", "http://localhost/"]
Defensive patterns

Strategy: validation

Validate before calling

// validate HEALTHCHECK history entry before reverse-building
func validHealthcheck(hist string) bool {
	i := strings.Index(hist, "HEALTHCHECK")
	if i < 0 { return true }
	parts := strings.SplitN(strings.TrimSpace(hist[i+len("HEALTHCHECK"):]), " ", 4)
	return len(parts) == 4
}

Try / catch

if _, cfgErr := builder.Run(...); cfgErr != nil && strings.Contains(cfgErr.Error(), "malformed HEALTHCHECK") {
	// fall back: strip HEALTHCHECK from history and retry
}

Prevention

When it happens

Trigger: Parsing a HEALTHCHECK instruction whose parameter section has fewer than 4 space-separated quoted parameters, e.g. `HEALTHCHECK CMD curl -f http://localhost/ || exit 1` without the surrounding JSON-array form (`HEALTHCHECK ["CMD", "curl", ...]`-style reconstruction) or with parameters collapsed onto fewer tokens, when calling the reverse Dockerfile builder (Run/NewBasicImageBuilder).

Common situations: Reconstructing Dockerfiles from OCI image history where the original HEALTHCHECK used shell form instead of exec/JSON form; hand-edited image history strings; images built by tooling that emitted non-standard HEALTHCHECK metadata.

Understand the failure class

Related errors


AI-assisted analysis of slimtoolkit/slim@81940d17fa (2026-08-31). Data as JSON: /api/errors/71ad31599a5df2ad. Report an issue: GitHub.

Appendix: source

Thrown at pkg/docker/dockerfile/reverse/reverse.go:804

		}
		// Cleans HEALTHCHECK part and splits the first part further
		parts := strings.SplitN(instParts[0], " ", 2)
		// joins the first part of the string
		instPart1 := strings.Join(parts[1:], " ")
		// removes quotes from the first part of the string
		instPart1 = strings.ReplaceAll(instPart1, "\"", "")

		// cleans it to assign it to the pointer config.Test
		config.Test = strings.Split(instPart1, " ")

		// removes the } from the second part of the string
		instPart2 := strings.Replace(instParts[1], "}", "", -1)
		// removes extra spaces from string
		instPart2 = strings.TrimSpace(instPart2)

		paramParts := strings.SplitN(instPart2, " ", 4)
		if len(paramParts) < 4 {
			return strTest, &config, fmt.Errorf("malformed HEALTHCHECK parameters: %q", data)
		}
		for i, param := range paramParts {
			paramParts[i] = strings.Trim(param, "\"'")
		}

		var err error
		config.Interval, err = time.ParseDuration(paramParts[0])
		if err != nil {
			log.Errorf("[%s] config.Interval err = %v", paramParts[0], err)
		}

		config.Timeout, err = time.ParseDuration(paramParts[1])
		if err != nil {
			log.Errorf("[%s] config.Timeout err = %v", paramParts[1], err)
		}

		config.StartPeriod, err = time.ParseDuration(paramParts[2])
		if err != nil {

View on GitHub (pinned to 81940d17fa)