Also include missing size attributes in layers

Docker build can in some cases omit size attributes in the layer
entries in its manifests.  This isn't a critical error for podman,
but it does cause it not to draw the little progress arrows.  So
let's add them if they're missing too.

Change-Id: Id5b1c5726fbe046b2f9f2994bf34f5fd7ecd90de
This commit is contained in:
James E. Blair 2021-07-06 17:52:01 -07:00
parent 8f2629ed85
commit 720d091653

View File

@ -296,20 +296,31 @@ class RegistryAPI:
res.status = '201 Created'
def _fix_manifest(self, namespace, content_type, body):
# The "docker build" commande can produce a manifest with a
# The "docker build" command can produce a manifest with a
# config that lacks a size attribute. It appears that Docker
# Hub will silently add the size, so any image fetched from
# there will have it. Podman build produces image configs
# with the size attribute. The podman family of tools fails
# to pull images without a config size. To avoid this error,
# we emulate the Docker Hub behavior.
# The same is true for the layer sizes, but it's not a fatal
# error; podman just doesn't draw its progress bar.
if (content_type ==
'application/vnd.docker.distribution.manifest.v2+json'):
data = json.loads(body)
changed = False
if 'size' not in data['config']:
digest = data['config']['digest']
size = self.storage.blob_size(namespace, digest)
data['config']['size'] = size
changed = True
for layer in data['layers']:
if 'size' not in layer:
digest = layer['digest']
size = self.storage.blob_size(namespace, digest)
layer['size'] = size
changed = True
if changed:
body = json.dumps(data).encode('utf8')
return body