summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJoffrey F <joffrey@docker.com>2018-05-24 17:19:18 -0700
committerJoffrey F <f.joffrey@gmail.com>2018-05-25 10:11:02 -0700
commit17f41b56726957177724711b5bff6d51b02e6d93 (patch)
treed97bdb247f8e5910e1239985b20dcd2dfe550d15
parent8228059f1e070e490b690dea539b065c449b0194 (diff)
downloaddocker-py-17f41b56726957177724711b5bff6d51b02e6d93.tar.gz
Avoid unwanted modification of dockerfile path
Signed-off-by: Joffrey F <joffrey@docker.com>
-rw-r--r--docker/api/build.py7
-rw-r--r--tests/integration/api_build_test.py53
2 files changed, 50 insertions, 10 deletions
diff --git a/docker/api/build.py b/docker/api/build.py
index f62a731..3c3f130 100644
--- a/docker/api/build.py
+++ b/docker/api/build.py
@@ -341,4 +341,9 @@ def process_dockerfile(dockerfile, path):
)
# Dockerfile is inside the context - return path relative to context root
- return (os.path.relpath(abs_dockerfile, path), None)
+ if dockerfile == abs_dockerfile:
+ # Only calculate relpath if necessary to avoid errors
+ # on Windows client -> Linux Docker
+ # see https://github.com/docker/compose/issues/5969
+ dockerfile = os.path.relpath(abs_dockerfile, path)
+ return (dockerfile, None)
diff --git a/tests/integration/api_build_test.py b/tests/integration/api_build_test.py
index 92e0062..baaf33e 100644
--- a/tests/integration/api_build_test.py
+++ b/tests/integration/api_build_test.py
@@ -415,18 +415,20 @@ class BuildTest(BaseAPIIntegrationTest):
f.write('hello world')
with open(os.path.join(base_dir, '.dockerignore'), 'w') as f:
f.write('.dockerignore\n')
- df = tempfile.NamedTemporaryFile()
- self.addCleanup(df.close)
- df.write(('\n'.join([
- 'FROM busybox',
- 'COPY . /src',
- 'WORKDIR /src',
- ])).encode('utf-8'))
- df.flush()
+ df_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, df_dir)
+ df_name = os.path.join(df_dir, 'Dockerfile')
+ with open(df_name, 'wb') as df:
+ df.write(('\n'.join([
+ 'FROM busybox',
+ 'COPY . /src',
+ 'WORKDIR /src',
+ ])).encode('utf-8'))
+ df.flush()
img_name = random_name()
self.tmp_imgs.append(img_name)
stream = self.client.build(
- path=base_dir, dockerfile=df.name, tag=img_name,
+ path=base_dir, dockerfile=df_name, tag=img_name,
decode=True
)
lines = []
@@ -472,6 +474,39 @@ class BuildTest(BaseAPIIntegrationTest):
[b'.', b'..', b'file.txt', b'custom.dockerfile']
) == sorted(lsdata)
+ def test_build_in_context_nested_dockerfile(self):
+ base_dir = tempfile.mkdtemp()
+ self.addCleanup(shutil.rmtree, base_dir)
+ with open(os.path.join(base_dir, 'file.txt'), 'w') as f:
+ f.write('hello world')
+ subdir = os.path.join(base_dir, 'hello', 'world')
+ os.makedirs(subdir)
+ with open(os.path.join(subdir, 'custom.dockerfile'), 'w') as df:
+ df.write('\n'.join([
+ 'FROM busybox',
+ 'COPY . /src',
+ 'WORKDIR /src',
+ ]))
+ img_name = random_name()
+ self.tmp_imgs.append(img_name)
+ stream = self.client.build(
+ path=base_dir, dockerfile='hello/world/custom.dockerfile',
+ tag=img_name, decode=True
+ )
+ lines = []
+ for chunk in stream:
+ lines.append(chunk)
+ assert 'Successfully tagged' in lines[-1]['stream']
+
+ ctnr = self.client.create_container(img_name, 'ls -a')
+ self.tmp_containers.append(ctnr)
+ self.client.start(ctnr)
+ lsdata = self.client.logs(ctnr).strip().split(b'\n')
+ assert len(lsdata) == 4
+ assert sorted(
+ [b'.', b'..', b'file.txt', b'hello']
+ ) == sorted(lsdata)
+
def test_build_in_context_abs_dockerfile(self):
base_dir = tempfile.mkdtemp()
self.addCleanup(shutil.rmtree, base_dir)