Here is a script that outputs the context tarball sent by docker build
to the Docker daemon. You can examine it like /path/to/script_below | tar -tv
for example.
#!/usr/bin/python3
from http.server import BaseHTTPRequestHandler
from re import match
from socketserver import UnixStreamServer
from subprocess import Popen, DEVNULL
from sys import exit, stdout
from tempfile import TemporaryDirectory
class ContextDumper(BaseHTTPRequestHandler):
def __init__(self, request, client_address, server):
# provide dummy client address for error reporting
super().__init__(request, ('docker_context', 0), server)
def do_HEAD(self):
if self.path != '/_ping':
self.send_error(404, '/_ping only')
do_GET = do_HEAD
def do_POST(self):
if match(r'/v1\.\d+/build\?', self.path) is None:
self.send_error(404, '/v1.X/build only')
exit(1)
total = 0
while True:
chunk_length = int(self.rfile.readline().strip(), 16)
total += chunk_length
chunk = self.rfile.read(chunk_length)
stdout.buffer.write(chunk)
self.rfile.readline()
if chunk_length == 0:
break
padding = (512 - (total % 512)) % 512
stdout.buffer.write(bytes(padding))
exit(0)
with TemporaryDirectory() as tmpdir:
socket_path = tmpdir + '/docker_context.sock'
fake_dockerd = UnixStreamServer(socket_path, ContextDumper)
with Popen(['docker', f'--host=unix://{socket_path}', 'build', '--file=/dev/null', '.'],
stdout=DEVNULL, stderr=DEVNULL) as builder:
fake_dockerd.serve_forever()