From 96e2de98517c8af2ccaef8fdcb09ce119f256049 Mon Sep 17 00:00:00 2001 From: Gustavo Date: Fri, 12 Jun 2026 12:56:30 -0300 Subject: [PATCH] fix(compose): forward port mappings to container run (-p) MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit `buildRunArguments()` was not translating `ContainerConfig.ports` into `-p` flags for the native `container run` command. Instead it relied on `PortProxy` which spawns a background TCP relay (`mocker __proxy`) — this fails because the mocker CLI lacks the `com.apple.security.network.server` entitlement to bind host ports. The native `container` CLI already handles port forwarding correctly when invoked with `-p`, so this change passes the port mappings directly. Fixes #19 💘 Generated with Crush Assisted-by: Crush:deepseek-v4-pro --- .../MockerKit/Container/ContainerEngine.swift | 4 ++++ Tests/MockerKitTests/ContainerEngineTests.swift | 16 ++++++++++++++++ 2 files changed, 20 insertions(+) diff --git a/Sources/MockerKit/Container/ContainerEngine.swift b/Sources/MockerKit/Container/ContainerEngine.swift index 857b213..ef2b9ea 100644 --- a/Sources/MockerKit/Container/ContainerEngine.swift +++ b/Sources/MockerKit/Container/ContainerEngine.swift @@ -91,6 +91,10 @@ public actor ContainerEngine { } } + for port in containerConfig.ports { + args += ["-p", port.description] + } + if let workingDir = containerConfig.workingDir, !workingDir.isEmpty { args += ["-w", workingDir] } diff --git a/Tests/MockerKitTests/ContainerEngineTests.swift b/Tests/MockerKitTests/ContainerEngineTests.swift index 6512245..4c499d7 100644 --- a/Tests/MockerKitTests/ContainerEngineTests.swift +++ b/Tests/MockerKitTests/ContainerEngineTests.swift @@ -144,6 +144,22 @@ struct ContainerEngineTests { #expect(args.contains("/path/to/kernel")) } + @Test("Run arguments include port mappings as -p flags") + func testRunArgumentsIncludePortMappings() throws { + let port1 = try PortMapping.parse("8080:80") + let port2 = try PortMapping.parse("443:443/tcp") + let config = ContainerConfig( + image: "nginx:latest", + ports: [port1, port2] + ) + + let args = ContainerEngine.buildRunArguments(name: "port-test", config: config) + + #expect(args.contains("-p")) + #expect(args.contains("8080:80/tcp")) + #expect(args.contains("443:443/tcp")) + } + @Test("Container CLI resolver prefers Homebrew installation") func testContainerCLIResolverPrefersHomebrew() throws { let root = URL(fileURLWithPath: NSTemporaryDirectory())