From 5d1cac64c1953663959fb71f46dff0179bf63f9a Mon Sep 17 00:00:00 2001 From: Anthony Sottile Date: Tue, 3 Aug 2021 13:08:07 -0700 Subject: [PATCH] ignore self-container when in docker-in-docker --- pre_commit/languages/docker.py | 7 ++++++- tests/languages/docker_test.py | 8 ++++++++ 2 files changed, 14 insertions(+), 1 deletion(-) diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 5bb3395af..644d8d293 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -8,6 +8,7 @@ from pre_commit.hook import Hook from pre_commit.languages import helpers from pre_commit.prefix import Prefix +from pre_commit.util import CalledProcessError from pre_commit.util import clean_path_on_failure from pre_commit.util import cmd_output_b @@ -42,7 +43,11 @@ def _get_docker_path(path: str) -> str: container_id = _get_container_id() - _, out, _ = cmd_output_b('docker', 'inspect', container_id) + try: + _, out, _ = cmd_output_b('docker', 'inspect', container_id) + except CalledProcessError: + # self-container was not visible from here (perhaps docker-in-docker) + return path container, = json.loads(out) for mount in container['Mounts']: diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 06a08bc9f..ec6bb83ca 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -8,6 +8,7 @@ import pytest from pre_commit.languages import docker +from pre_commit.util import CalledProcessError DOCKER_CGROUP_EXAMPLE = b'''\ 12:hugetlb:/docker/c33988ec7651ebc867cb24755eaf637a6734088bc7eef59d5799293a9e5450f7 @@ -171,3 +172,10 @@ def test_get_docker_path_in_docker_windows(in_docker): path = r'c:\folder\test\something' expected = r'c:\users\user\test\something' assert docker._get_docker_path(path) == expected + + +def test_get_docker_path_in_docker_docker_in_docker(in_docker): + # won't be able to discover "self" container in true docker-in-docker + err = CalledProcessError(1, (), 0, b'', b'') + with mock.patch.object(docker, 'cmd_output_b', side_effect=err): + assert docker._get_docker_path('/project') == '/project'