From 8dbb41aff4ca1c45bd60d92e5a3597d2a57f6a1c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Ignacio=20L=C3=B3pez=20Luna?= Date: Fri, 23 Jan 2026 13:35:26 +0100 Subject: [PATCH 1/2] fix(containers): improve port binding error message for clarity --- cmd/cli/pkg/standalone/containers.go | 14 ++++++++++++++ 1 file changed, 14 insertions(+) diff --git a/cmd/cli/pkg/standalone/containers.go b/cmd/cli/pkg/standalone/containers.go index 7bcddad6..7dc5f339 100644 --- a/cmd/cli/pkg/standalone/containers.go +++ b/cmd/cli/pkg/standalone/containers.go @@ -289,6 +289,17 @@ type TLSOptions struct { // tlsCertContainerPath is the path where TLS certificates will be mounted in the container. const tlsCertContainerPath = "/etc/model-runner/certs" +// isPortBindingError checks if the error indicates a port is already in use +func isPortBindingError(err error) bool { + if err == nil { + return false + } + errStr := err.Error() + return strings.Contains(errStr, "ports are not available") && + (strings.Contains(errStr, "address already in use") || + strings.Contains(errStr, "Only one usage of each socket address")) +} + // CreateControllerContainer creates and starts a controller container. func CreateControllerContainer(ctx context.Context, dockerClient *client.Client, port uint16, host string, environment string, doNotTrack bool, gpu gpupkg.GPUSupport, backend string, modelStorageVolume string, printer StatusPrinter, engineKind types.ModelRunnerEngineKind, debug bool, vllmOnWSL bool, proxyCert string, tlsOpts TLSOptions) error { imageName := controllerImageName(gpu, backend) @@ -554,6 +565,9 @@ func CreateControllerContainer(ctx context.Context, dockerClient *client.Client, if created { _ = dockerClient.ContainerRemove(ctx, resp.ID, container.RemoveOptions{Force: true}) } + if isPortBindingError(err) { + return fmt.Errorf("failed to start container %s: %w\n\nThe port may already be in use by Docker Desktop's model runner.\nTry running: docker desktop disable model-runner", controllerContainerName, err) + } return fmt.Errorf("failed to start container %s: %w", controllerContainerName, err) } From db04cfe171c9263dc16b403fc3dd26e2bd772496 Mon Sep 17 00:00:00 2001 From: Ignasi Date: Fri, 23 Jan 2026 14:59:22 +0100 Subject: [PATCH 2/2] Update cmd/cli/pkg/standalone/containers.go Co-authored-by: Dorin-Andrei Geman --- cmd/cli/pkg/standalone/containers.go | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/cmd/cli/pkg/standalone/containers.go b/cmd/cli/pkg/standalone/containers.go index 7dc5f339..4e7579b8 100644 --- a/cmd/cli/pkg/standalone/containers.go +++ b/cmd/cli/pkg/standalone/containers.go @@ -566,7 +566,7 @@ func CreateControllerContainer(ctx context.Context, dockerClient *client.Client, _ = dockerClient.ContainerRemove(ctx, resp.ID, container.RemoveOptions{Force: true}) } if isPortBindingError(err) { - return fmt.Errorf("failed to start container %s: %w\n\nThe port may already be in use by Docker Desktop's model runner.\nTry running: docker desktop disable model-runner", controllerContainerName, err) + return fmt.Errorf("failed to start container %s: %w\n\nThe port may already be in use by Docker Desktop's Model Runner.\nTry running: docker desktop disable model-runner", controllerContainerName, err) } return fmt.Errorf("failed to start container %s: %w", controllerContainerName, err) }