diff --git a/Sources/Container-Compose/Commands/ComposeUp.swift b/Sources/Container-Compose/Commands/ComposeUp.swift index d274ff9..317381b 100644 --- a/Sources/Container-Compose/Commands/ComposeUp.swift +++ b/Sources/Container-Compose/Commands/ComposeUp.swift @@ -442,7 +442,7 @@ public struct ComposeUp: AsyncParsableCommand, @unchecked Sendable { for port in ports { let resolvedPort = resolveVariable(port, with: environmentVariables) runCommandArgs.append("-p") - runCommandArgs.append("0.0.0.0:\(resolvedPort)") + runCommandArgs.append(composePortToRunArg(resolvedPort)) } } diff --git a/Sources/Container-Compose/Helper Functions.swift b/Sources/Container-Compose/Helper Functions.swift index 9a21a2b..0dfd152 100644 --- a/Sources/Container-Compose/Helper Functions.swift +++ b/Sources/Container-Compose/Helper Functions.swift @@ -104,6 +104,48 @@ public func deriveProjectName(cwd: String) -> String { return projectName } +/// Converts Docker Compose port specification into a container run -p format. +/// Handles various formats: "PORT", "HOST:PORT", "IP:HOST:PORT", and optional protocol. +/// - Parameter portSpec: The port specification string from docker-compose.yml. +/// - Returns: A properly formatted port binding for `container run -p`. +public func composePortToRunArg(_ portSpec: String) -> String { + // Check for protocol suffix (e.g., "/tcp" or "/udp") + var protocolSuffix = "" + var portBody = portSpec + if let slashRange = portSpec.range(of: "/", options: [.backwards]) { + let afterSlash = portSpec[slashRange.lowerBound...] + let protocolPart = String(afterSlash) + if protocolPart == "/tcp" || protocolPart == "/udp" { + protocolSuffix = protocolPart + portBody = String(portSpec[..