diff --git a/pre_commit/languages/docker.py b/pre_commit/languages/docker.py index 59a53b4f..4517050b 100644 --- a/pre_commit/languages/docker.py +++ b/pre_commit/languages/docker.py @@ -73,11 +73,18 @@ def install_environment( os.mkdir(directory) +def get_docker_user(): # pragma: windows no cover + try: + return '{}:{}'.format(os.getuid(), os.getgid()) + except AttributeError: + return '1000:1000' + + def docker_cmd(): # pragma: windows no cover return ( 'docker', 'run', '--rm', - '-u', '{}:{}'.format(os.getuid(), os.getgid()), + '-u', get_docker_user(), # https://docs.docker.com/engine/reference/commandline/run/#mount-volumes-from-container-volumes-from # The `Z` option tells Docker to label the content with a private # unshared label. Only the current container can use a private volume. diff --git a/tests/languages/docker_test.py b/tests/languages/docker_test.py index 9f7f55cf..1a96e69d 100644 --- a/tests/languages/docker_test.py +++ b/tests/languages/docker_test.py @@ -13,3 +13,14 @@ def test_docker_is_running_process_error(): side_effect=CalledProcessError(*(None,) * 4), ): assert docker.docker_is_running() is False + + +def test_docker_fallback_user(): + def invalid_attribute(): + raise AttributeError + with mock.patch.multiple( + 'os', create=True, + getuid=invalid_attribute, + getgid=invalid_attribute, + ): + assert docker.get_docker_user() == '1000:1000'