Unverified Kaydet (Commit) e1e40487 authored tarafından Joffrey F's avatar Joffrey F Kaydeden (comit) GitHub

Merge pull request #2183 from docker/c6356-longpath-prefix

Correctly handle longpath prefix in process_dockerfile when joining paths
...@@ -339,7 +339,14 @@ def process_dockerfile(dockerfile, path): ...@@ -339,7 +339,14 @@ def process_dockerfile(dockerfile, path):
abs_dockerfile = dockerfile abs_dockerfile = dockerfile
if not os.path.isabs(dockerfile): if not os.path.isabs(dockerfile):
abs_dockerfile = os.path.join(path, 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 if (os.path.splitdrive(path)[0] != os.path.splitdrive(abs_dockerfile)[0] or
os.path.relpath(abs_dockerfile, path).startswith('..')): os.path.relpath(abs_dockerfile, path).startswith('..')):
# Dockerfile not in context - read data to insert into tar later # Dockerfile not in context - read data to insert into tar later
......
...@@ -14,6 +14,7 @@ INSECURE_REGISTRY_DEPRECATION_WARNING = \ ...@@ -14,6 +14,7 @@ INSECURE_REGISTRY_DEPRECATION_WARNING = \
'is deprecated and non-functional. Please remove it.' 'is deprecated and non-functional. Please remove it.'
IS_WINDOWS_PLATFORM = (sys.platform == 'win32') IS_WINDOWS_PLATFORM = (sys.platform == 'win32')
WINDOWS_LONGPATH_PREFIX = '\\\\?\\'
DEFAULT_USER_AGENT = "docker-sdk-python/{0}".format(version) DEFAULT_USER_AGENT = "docker-sdk-python/{0}".format(version)
DEFAULT_NUM_POOLS = 25 DEFAULT_NUM_POOLS = 25
......
import gzip import gzip
import io import io
import shutil
import docker import docker
from docker import auth from docker import auth
from docker.api.build import process_dockerfile
from .api_test import BaseAPIClientTest, fake_request, url_prefix
import pytest import pytest
from ..helpers import make_tree
from .api_test import BaseAPIClientTest, fake_request, url_prefix
class BuildTest(BaseAPIClientTest): class BuildTest(BaseAPIClientTest):
def test_build_container(self): def test_build_container(self):
...@@ -161,3 +165,61 @@ class BuildTest(BaseAPIClientTest): ...@@ -161,3 +165,61 @@ class BuildTest(BaseAPIClientTest):
self.client._set_auth_headers(headers) self.client._set_auth_headers(headers)
assert headers == expected_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
)
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment