mirror of https://github.com/docker/docker-py.git
Correctly handle longpath prefix in process_dockerfile when joining paths
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
f3231a1ebb
commit
114630161a
|
@ -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 = \
|
||||||
'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
|
||||||
|
|
|
@ -1,12 +1,16 @@
|
||||||
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):
|
||||||
|
|
||||||
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
|
||||||
|
)
|
||||||
|
|
Loading…
Reference in New Issue