|
|
@@ -95,19 +95,10 @@ def get_image_digest(service, allow_push=False):
|
|
|
if separator == '@':
|
|
|
return service.options['image']
|
|
|
|
|
|
- try:
|
|
|
- image = service.image()
|
|
|
- except NoSuchImageError:
|
|
|
- action = 'build' if 'build' in service.options else 'pull'
|
|
|
- raise UserError(
|
|
|
- "Image not found for service '{service}'. "
|
|
|
- "You might need to run `docker-compose {action} {service}`."
|
|
|
- .format(service=service.name, action=action))
|
|
|
+ digest = get_digest(service)
|
|
|
|
|
|
- if image['RepoDigests']:
|
|
|
- # TODO: pick a digest based on the image tag if there are multiple
|
|
|
- # digests
|
|
|
- return image['RepoDigests'][0]
|
|
|
+ if digest:
|
|
|
+ return digest
|
|
|
|
|
|
if 'build' not in service.options:
|
|
|
raise NeedsPull(service.image_name, service.name)
|
|
|
@@ -118,6 +109,32 @@ def get_image_digest(service, allow_push=False):
|
|
|
return push_image(service)
|
|
|
|
|
|
|
|
|
+def get_digest(service):
|
|
|
+ digest = None
|
|
|
+ try:
|
|
|
+ image = service.image()
|
|
|
+ # TODO: pick a digest based on the image tag if there are multiple
|
|
|
+ # digests
|
|
|
+ if image['RepoDigests']:
|
|
|
+ digest = image['RepoDigests'][0]
|
|
|
+ except NoSuchImageError:
|
|
|
+ try:
|
|
|
+ # Fetch the image digest from the registry
|
|
|
+ distribution = service.get_image_registry_data()
|
|
|
+
|
|
|
+ if distribution['Descriptor']['digest']:
|
|
|
+ digest = '{image_name}@{digest}'.format(
|
|
|
+ image_name=service.image_name,
|
|
|
+ digest=distribution['Descriptor']['digest']
|
|
|
+ )
|
|
|
+ except NoSuchImageError:
|
|
|
+ raise UserError(
|
|
|
+ "Digest not found for service '{service}'. "
|
|
|
+ "Repository does not exist or may require 'docker login'"
|
|
|
+ .format(service=service.name))
|
|
|
+ return digest
|
|
|
+
|
|
|
+
|
|
|
def push_image(service):
|
|
|
try:
|
|
|
digest = service.push()
|