diff --git a/src/GZCTF/Services/Container/Manager/DockerManager.cs b/src/GZCTF/Services/Container/Manager/DockerManager.cs index 3d8899274..bcc8493f8 100644 --- a/src/GZCTF/Services/Container/Manager/DockerManager.cs +++ b/src/GZCTF/Services/Container/Manager/DockerManager.cs @@ -226,11 +226,9 @@ await _client.Containers.RemoveContainerAsync(parameters.Name, if (!_meta.ExposePort) return container; - var portString = config.ExposedPort.ToString(); - var bindings = info.NetworkSettings.Ports.Where(kv => kv.Key.StartsWith(portString)).Select(kv => kv.Value) - .SingleOrDefault(); + var bindings = GetPublishedPortBindings(info.NetworkSettings.Ports, config.ExposedPort); - if (bindings is not { Count: > 0 }) + if (bindings is []) { _logger.SystemLog( StaticLocalizer[ @@ -258,6 +256,30 @@ await _client.Containers.RemoveContainerAsync(parameters.Name, return container; } + internal static IList GetPublishedPortBindings( + IDictionary>? ports, int exposedPort) + { + if (ports is not { Count: > 0 }) + return []; + + var port = exposedPort.ToString(); + var portPrefix = $"{port}/"; + var matchedPorts = ports + .Where(kv => kv.Value is { Count: > 0 } + && kv.Key.StartsWith(portPrefix, StringComparison.Ordinal)) + .ToArray(); + + return matchedPorts switch + { + [] => [], + [{ Value: var bindings }] => bindings, + _ => matchedPorts.FirstOrDefault(kv => + kv.Key.EndsWith("/tcp", StringComparison.OrdinalIgnoreCase)) + .Value + ?? matchedPorts[0].Value + }; + } + private CreateContainerParameters GetCreateContainerParameters(GZCTF.Models.Internal.ContainerConfig config) => new() {