Skip to content

Commit 33cae41

Browse files
committed
Support absolute paths for in-context Dockerfiles
Signed-off-by: Joffrey F <[email protected]>
1 parent 298b7e1 commit 33cae41

File tree

3 files changed

+46
-9
lines changed

3 files changed

+46
-9
lines changed

docker/api/build.py

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -332,10 +332,12 @@ def process_dockerfile(dockerfile, path):
332332

333333
if (os.path.splitdrive(path)[0] != os.path.splitdrive(abs_dockerfile)[0] or
334334
os.path.relpath(abs_dockerfile, path).startswith('..')):
335+
# Dockerfile not in context - read data to insert into tar later
335336
with open(abs_dockerfile, 'r') as df:
336337
return (
337338
'.dockerfile.{0:x}'.format(random.getrandbits(160)),
338339
df.read()
339340
)
340-
else:
341-
return (dockerfile, None)
341+
342+
# Dockerfile is inside the context - return path relative to context root
343+
return (os.path.relpath(abs_dockerfile, path), None)

setup.py

Lines changed: 10 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -9,12 +9,16 @@
99

1010
from setuptools import setup, find_packages
1111

12-
if 'docker-py' in [x.project_name for x in pip.get_installed_distributions()]:
13-
print(
14-
'ERROR: "docker-py" needs to be uninstalled before installing this'
15-
' package:\npip uninstall docker-py', file=sys.stderr
16-
)
17-
sys.exit(1)
12+
try:
13+
if 'docker-py' in [
14+
x.project_name for x in pip.get_installed_distributions()]:
15+
print(
16+
'ERROR: "docker-py" needs to be uninstalled before installing this'
17+
' package:\npip uninstall docker-py', file=sys.stderr
18+
)
19+
sys.exit(1)
20+
except AttributeError:
21+
pass
1822

1923
ROOT_DIR = os.path.dirname(__file__)
2024
SOURCE_DIR = os.path.join(ROOT_DIR)

tests/integration/api_build_test.py

Lines changed: 32 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -452,7 +452,6 @@ def test_build_in_context_dockerfile(self):
452452
'COPY . /src',
453453
'WORKDIR /src',
454454
]))
455-
print(os.path.join(base_dir, 'custom.dockerfile'))
456455
img_name = random_name()
457456
self.tmp_imgs.append(img_name)
458457
stream = self.client.build(
@@ -472,3 +471,35 @@ def test_build_in_context_dockerfile(self):
472471
assert sorted(
473472
[b'.', b'..', b'file.txt', b'custom.dockerfile']
474473
) == sorted(lsdata)
474+
475+
def test_build_in_context_abs_dockerfile(self):
476+
base_dir = tempfile.mkdtemp()
477+
self.addCleanup(shutil.rmtree, base_dir)
478+
abs_dockerfile_path = os.path.join(base_dir, 'custom.dockerfile')
479+
with open(os.path.join(base_dir, 'file.txt'), 'w') as f:
480+
f.write('hello world')
481+
with open(abs_dockerfile_path, 'w') as df:
482+
df.write('\n'.join([
483+
'FROM busybox',
484+
'COPY . /src',
485+
'WORKDIR /src',
486+
]))
487+
img_name = random_name()
488+
self.tmp_imgs.append(img_name)
489+
stream = self.client.build(
490+
path=base_dir, dockerfile=abs_dockerfile_path, tag=img_name,
491+
decode=True
492+
)
493+
lines = []
494+
for chunk in stream:
495+
lines.append(chunk)
496+
assert 'Successfully tagged' in lines[-1]['stream']
497+
498+
ctnr = self.client.create_container(img_name, 'ls -a')
499+
self.tmp_containers.append(ctnr)
500+
self.client.start(ctnr)
501+
lsdata = self.client.logs(ctnr).strip().split(b'\n')
502+
assert len(lsdata) == 4
503+
assert sorted(
504+
[b'.', b'..', b'file.txt', b'custom.dockerfile']
505+
) == sorted(lsdata)

0 commit comments

Comments
 (0)