From 0b8b483cb7f08aa0a1b7bc926f7a741e001bf409 Mon Sep 17 00:00:00 2001 From: Monika Kairaityte Date: Mon, 26 May 2025 22:10:05 +0300 Subject: [PATCH] Print full dockerfile path instead of context on error Current error message does not provide the exact path where the Dockerfile is being searched. This commit distinguishes two types of errors when Dockerfile is not found in build context: - when the context does not have provided custom-named Dockerfile, the path in the error message is absolute: "OSError: Dockerfile not found in .../podman-compose/tests/integration/build_fail/context_no_file/custom-named-Dockerfile" - when the context does not have any Dockerfile, the path in the error message is: "OSError: Dockerfile not found in .../podman-compose/tests/integration/build_fail/context_no_file" Only this error message was used before the fix. Signed-off-by: Monika Kairaityte Co-authored-by: Siteshwar Vashisht --- podman_compose.py | 5 +++ .../build_fail/context_no_file/NotDockerfile | 1 + .../integration/build_fail/docker-compose.yml | 9 +++++ .../test_podman_compose_build_fail.py | 39 +++++++++++++++++++ 4 files changed, 54 insertions(+) create mode 100644 tests/integration/build_fail/context_no_file/NotDockerfile diff --git a/podman_compose.py b/podman_compose.py index 28408d9..d523924 100755 --- a/podman_compose.py +++ b/podman_compose.py @@ -2752,8 +2752,10 @@ def container_to_build_args( build_args = [] if not is_path_git_url(ctx): + custom_dockerfile_given = False if dockerfile: dockerfile = os.path.join(ctx, dockerfile) + custom_dockerfile_given = True else: dockerfile_alts = [ "Containerfile", @@ -2773,6 +2775,9 @@ def container_to_build_args( dockerfile = os.path.normpath(os.path.join(ctx, dockerfile)) build_args.extend(["-f", dockerfile]) else: + if custom_dockerfile_given: + # custom dockerfile name was also not found in the file system + raise OSError(f"Dockerfile not found in {dockerfile}") raise OSError(f"Dockerfile not found in {ctx}") build_args.extend(["-t", cnt["image"]]) diff --git a/tests/integration/build_fail/context_no_file/NotDockerfile b/tests/integration/build_fail/context_no_file/NotDockerfile new file mode 100644 index 0000000..9daeafb --- /dev/null +++ b/tests/integration/build_fail/context_no_file/NotDockerfile @@ -0,0 +1 @@ +test diff --git a/tests/integration/build_fail/docker-compose.yml b/tests/integration/build_fail/docker-compose.yml index 5641a64..818cba7 100644 --- a/tests/integration/build_fail/docker-compose.yml +++ b/tests/integration/build_fail/docker-compose.yml @@ -3,3 +3,12 @@ services: test: build: ./context image: build-fail-img + test_no_dockerfile: + build: + context: ./context_no_file + image: busybox + test_no_custom_dockerfile: + build: + context: ./context_no_file + dockerfile: Dockerfile-alt + image: busybox diff --git a/tests/integration/build_fail/test_podman_compose_build_fail.py b/tests/integration/build_fail/test_podman_compose_build_fail.py index 44dd920..010a673 100644 --- a/tests/integration/build_fail/test_podman_compose_build_fail.py +++ b/tests/integration/build_fail/test_podman_compose_build_fail.py @@ -22,9 +22,48 @@ class TestComposeBuildFail(unittest.TestCase, RunSubprocessMixin): "-f", compose_yaml_path(), "build", + "test", ], expected_returncode=127, ) self.assertIn("RUN this_command_does_not_exist", str(output)) self.assertIn("this_command_does_not_exist: not found", str(error)) self.assertIn("while running runtime: exit status 127", str(error)) + + def test_dockerfile_does_not_exist(self): + out, error = self.run_subprocess_assert_returncode( + [ + podman_compose_path(), + "-f", + compose_yaml_path(), + "build", + "test_no_dockerfile", + ], + expected_returncode=1, + ) + error = error.decode('utf-8') + result = '\n'.join(error.splitlines()[-1:]) + + expected_path = os.path.join(os.path.dirname(__file__), "context_no_file") + expected = f'OSError: Dockerfile not found in {expected_path}' + + self.assertEqual(expected, result) + + def test_custom_dockerfile_does_not_exist(self): + out, error = self.run_subprocess_assert_returncode( + [ + podman_compose_path(), + "-f", + compose_yaml_path(), + "build", + "test_no_custom_dockerfile", + ], + expected_returncode=1, + ) + error = error.decode('utf-8') + result = '\n'.join(error.splitlines()[-1:]) + + expected_path = os.path.join(os.path.dirname(__file__), "context_no_file/Dockerfile-alt") + expected = f'OSError: Dockerfile not found in {expected_path}' + + self.assertEqual(expected, result)