From f89b86491b9bb6d54a9b1cc4c3b9f08cb828feef Mon Sep 17 00:00:00 2001 From: Aditya Tripathi Date: Mon, 3 Nov 2025 13:44:06 +0000 Subject: [PATCH] feat: custom docker entrypoint --- bootstrap/helpers/docker.php | 25 +++++++++++ tests/Feature/DockerCustomCommandsTest.php | 49 ++++++++++++++++++++++ 2 files changed, 74 insertions(+) diff --git a/bootstrap/helpers/docker.php b/bootstrap/helpers/docker.php index d6c9b5bdf..93d37460e 100644 --- a/bootstrap/helpers/docker.php +++ b/bootstrap/helpers/docker.php @@ -942,6 +942,7 @@ function convertDockerRunToCompose(?string $custom_docker_run_options = null) '--shm-size' => 'shm_size', '--gpus' => 'gpus', '--hostname' => 'hostname', + '--entrypoint' => 'entrypoint', ]); foreach ($matches as $match) { $option = $match[1]; @@ -962,6 +963,24 @@ function convertDockerRunToCompose(?string $custom_docker_run_options = null) $options[$option] = array_unique($options[$option]); } } + if ($option === '--entrypoint') { + // Match --entrypoint=value or --entrypoint value + // Handle quoted strings: --entrypoint "sh -c 'command'" or --entrypoint='command' + // Try double quotes first, then single quotes, then unquoted + if (preg_match('/--entrypoint(?:=|\s+)"([^"]+)"/', $custom_docker_run_options, $entrypoint_matches)) { + $value = $entrypoint_matches[1]; + } elseif (preg_match("/--entrypoint(?:=|\s+)'([^']+)'/", $custom_docker_run_options, $entrypoint_matches)) { + $value = $entrypoint_matches[1]; + } elseif (preg_match('/--entrypoint(?:=|\s+)([^\s]+)/', $custom_docker_run_options, $entrypoint_matches)) { + $value = $entrypoint_matches[1]; + } else { + $value = null; + } + if ($value && ! empty(trim($value))) { + $options[$option][] = $value; + $options[$option] = array_unique($options[$option]); + } + } if (isset($match[2]) && $match[2] !== '') { $value = $match[2]; $options[$option][] = $value; @@ -1002,6 +1021,12 @@ function convertDockerRunToCompose(?string $custom_docker_run_options = null) if (! is_null($value) && is_array($value) && count($value) > 0 && ! empty(trim($value[0]))) { $compose_options->put($mapping[$option], $value[0]); } + } elseif ($option === '--entrypoint') { + if (! is_null($value) && is_array($value) && count($value) > 0 && ! empty(trim($value[0]))) { + // Docker compose accepts entrypoint as either a string or an array + // Keep it as a string for simplicity - docker compose will handle it + $compose_options->put($mapping[$option], $value[0]); + } } elseif ($option === '--gpus') { $payload = [ 'driver' => 'nvidia', diff --git a/tests/Feature/DockerCustomCommandsTest.php b/tests/Feature/DockerCustomCommandsTest.php index a7829a534..b45a0c3db 100644 --- a/tests/Feature/DockerCustomCommandsTest.php +++ b/tests/Feature/DockerCustomCommandsTest.php @@ -125,3 +125,52 @@ ], ]); }); + +test('ConvertEntrypointSimple', function () { + $input = '--entrypoint /bin/sh'; + $output = convertDockerRunToCompose($input); + expect($output)->toBe([ + 'entrypoint' => '/bin/sh', + ]); +}); + +test('ConvertEntrypointWithEquals', function () { + $input = '--entrypoint=/bin/bash'; + $output = convertDockerRunToCompose($input); + expect($output)->toBe([ + 'entrypoint' => '/bin/bash', + ]); +}); + +test('ConvertEntrypointWithArguments', function () { + $input = '--entrypoint "sh -c npm install"'; + $output = convertDockerRunToCompose($input); + expect($output)->toBe([ + 'entrypoint' => 'sh -c npm install', + ]); +}); + +test('ConvertEntrypointWithSingleQuotes', function () { + $input = "--entrypoint 'memcached -m 256'"; + $output = convertDockerRunToCompose($input); + expect($output)->toBe([ + 'entrypoint' => 'memcached -m 256', + ]); +}); + +test('ConvertEntrypointWithOtherOptions', function () { + $input = '--entrypoint /bin/bash --cap-add SYS_ADMIN --privileged'; + $output = convertDockerRunToCompose($input); + expect($output)->toHaveKeys(['entrypoint', 'cap_add', 'privileged']) + ->and($output['entrypoint'])->toBe('/bin/bash') + ->and($output['cap_add'])->toBe(['SYS_ADMIN']) + ->and($output['privileged'])->toBe(true); +}); + +test('ConvertEntrypointComplex', function () { + $input = '--entrypoint "sh -c \'npm install && npm start\'"'; + $output = convertDockerRunToCompose($input); + expect($output)->toBe([ + 'entrypoint' => "sh -c 'npm install && npm start'", + ]); +});