diff options
author | Joffrey F <joffrey@docker.com> | 2018-11-26 17:33:30 -0800 |
---|---|---|
committer | Joffrey F <joffrey@docker.com> | 2018-11-26 17:34:26 -0800 |
commit | 114630161a08b19489e464ad2c1a70ccccc9cc74 (patch) | |
tree | 4cdca2a00f91f6b1d5b709636e902ccaf0170d57 | |
parent | f3231a1ebb6512b0ee95a380b9105618b59c8758 (diff) | |
download | docker-py-114630161a08b19489e464ad2c1a70ccccc9cc74.tar.gz |
Correctly handle longpath prefix in process_dockerfile when joining pathsc6356-longpath-prefix
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r-- | docker/api/build.py | 9 | ||||
-rw-r--r-- | docker/constants.py | 1 | ||||
-rw-r--r-- | tests/unit/api_build_test.py | 64 |
3 files changed, 72 insertions, 2 deletions
diff --git a/docker/api/build.py b/docker/api/build.py index 0486dce..3a67ff8 100644 --- a/docker/api/build.py +++ b/docker/api/build.py @@ -339,7 +339,14 @@ def process_dockerfile(dockerfile, path): abs_dockerfile = dockerfile if not os.path.isabs(dockerfile): abs_dockerfile = os.path.join(path, dockerfile) - + if constants.IS_WINDOWS_PLATFORM and path.startswith( + constants.WINDOWS_LONGPATH_PREFIX): + abs_dockerfile = '{}{}'.format( + constants.WINDOWS_LONGPATH_PREFIX, + os.path.normpath( + abs_dockerfile[len(constants.WINDOWS_LONGPATH_PREFIX):] + ) + ) if (os.path.splitdrive(path)[0] != os.path.splitdrive(abs_dockerfile)[0] or os.path.relpath(abs_dockerfile, path).startswith('..')): # Dockerfile not in context - read data to insert into tar later diff --git a/docker/constants.py b/docker/constants.py index 7565a76..1ab11ec 100644 --- a/docker/constants.py +++ b/docker/constants.py @@ -14,6 +14,7 @@ INSECURE_REGISTRY_DEPRECATION_WARNING = \ 'is deprecated and non-functional. Please remove it.' IS_WINDOWS_PLATFORM = (sys.platform == 'win32') +WINDOWS_LONGPATH_PREFIX = '\\\\?\\' DEFAULT_USER_AGENT = "docker-sdk-python/{0}".format(version) DEFAULT_NUM_POOLS = 25 diff --git a/tests/unit/api_build_test.py b/tests/unit/api_build_test.py index a7f34fd..59470ca 100644 --- a/tests/unit/api_build_test.py +++ b/tests/unit/api_build_test.py @@ -1,12 +1,16 @@ import gzip import io +import shutil import docker from docker import auth +from docker.api.build import process_dockerfile -from .api_test import BaseAPIClientTest, fake_request, url_prefix import pytest +from ..helpers import make_tree +from .api_test import BaseAPIClientTest, fake_request, url_prefix + class BuildTest(BaseAPIClientTest): def test_build_container(self): @@ -161,3 +165,61 @@ class BuildTest(BaseAPIClientTest): self.client._set_auth_headers(headers) assert headers == expected_headers + + @pytest.mark.skipif( + not docker.constants.IS_WINDOWS_PLATFORM, + reason='Windows-specific syntax') + def test_process_dockerfile_win_longpath_prefix(self): + dirs = [ + 'foo', 'foo/bar', 'baz', + ] + + files = [ + 'Dockerfile', 'foo/Dockerfile.foo', 'foo/bar/Dockerfile.bar', + 'baz/Dockerfile.baz', + ] + + base = make_tree(dirs, files) + self.addCleanup(shutil.rmtree, base) + + def pre(path): + return docker.constants.WINDOWS_LONGPATH_PREFIX + path + + assert process_dockerfile(None, pre(base)) == (None, None) + assert process_dockerfile('Dockerfile', pre(base)) == ( + 'Dockerfile', None + ) + assert process_dockerfile('foo/Dockerfile.foo', pre(base)) == ( + 'foo/Dockerfile.foo', None + ) + assert process_dockerfile( + '../Dockerfile', pre(base + '\\foo') + )[1] is not None + assert process_dockerfile( + '../baz/Dockerfile.baz', pre(base + '/baz') + ) == ('../baz/Dockerfile.baz', None) + + def test_process_dockerfile(self): + dirs = [ + 'foo', 'foo/bar', 'baz', + ] + + files = [ + 'Dockerfile', 'foo/Dockerfile.foo', 'foo/bar/Dockerfile.bar', + 'baz/Dockerfile.baz', + ] + + base = make_tree(dirs, files) + self.addCleanup(shutil.rmtree, base) + + assert process_dockerfile(None, base) == (None, None) + assert process_dockerfile('Dockerfile', base) == ('Dockerfile', None) + assert process_dockerfile('foo/Dockerfile.foo', base) == ( + 'foo/Dockerfile.foo', None + ) + assert process_dockerfile( + '../Dockerfile', base + '/foo' + )[1] is not None + assert process_dockerfile('../baz/Dockerfile.baz', base + '/baz') == ( + '../baz/Dockerfile.baz', None + ) |