diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php index d152ba58f..00300d26a 100644 --- a/bootstrap/helpers/docker.php +++ b/bootstrap/helpers/docker.php @@ -166,11 +166,13 @@ function format_docker_labels_to_json(string|array $rawOutput): Collection $outputArray = explode(',', $outputLine); return collect($outputArray) - ->map(function ($outputLine) { - return explode('=', $outputLine); - }) ->mapWithKeys(function ($outputLine) { - return [$outputLine[0] => $outputLine[1]]; + $label = explode('=', $outputLine, 2); + if (count($label) !== 2) { + return []; + } + + return [$label[0] => $label[1]]; }); })[0]; } diff --git a/tests/Unit/Api/LogEndpointHelpersTest.php b/tests/Unit/Api/LogEndpointHelpersTest.php index a899669d6..c4173bd69 100644 --- a/tests/Unit/Api/LogEndpointHelpersTest.php +++ b/tests/Unit/Api/LogEndpointHelpersTest.php @@ -94,6 +94,18 @@ ->toBe(['first', 'third']); }); +it('filters service containers when another Docker label contains commas', function () { + $containers = collect([ + [ + 'ID' => 'app', + 'Labels' => 'traefik.http.routers.app.rule=Host(`one.example.com`,`two.example.com`),coolify.name=app-service-uuid', + ], + ]); + + expect(filterServiceSubContainersByName($containers, 'app-service-uuid')->pluck('ID')->all()) + ->toBe(['app']); +}); + it('does not interpolate the requested service name into the docker ps shell command', function () { $source = file_get_contents(__DIR__.'/../../../bootstrap/helpers/docker.php');