def get_docker_image_meta()

in scripts/setup.py [0:0]


def get_docker_image_meta(build=False):
    image = 'mozilla/addons-server'
    version = 'local'
    digest = None

    # First get the tag from the full tag variable
    tag = get_value('DOCKER_TAG', f'{image}:{version}')
    # extract version or digest from existing tag
    if '@' in tag:
        image, digest = tag.split('@')
        version = None
    elif ':' in tag:
        image, version = tag.split(':')

    # DOCKER_DIGEST or DOCKER_VERSION can override the extracted version or digest
    # Note: it will inherit the image from the provided DOCKER_TAG if also provided
    if bool(os.environ.get('DOCKER_DIGEST', False)):
        digest = os.environ['DOCKER_DIGEST']
        tag = f'{image}@{digest}'
        version = None
    elif bool(os.environ.get('DOCKER_VERSION', False)):
        version = os.environ['DOCKER_VERSION']
        tag = f'{image}:{version}'

    is_local = version == 'local' and digest is None
    docker_target = (
        get_value('DOCKER_TARGET', 'development')
        if is_local
        else os.environ.get('DOCKER_TARGET', 'production')
    )
    is_production = docker_target == 'production'
    docker_commit = os.environ.get('DOCKER_COMMIT')
    docker_build = os.environ.get('DOCKER_BUILD')

    valid_version_digest = (version and not digest) or (digest and not version)
    valid_docker_target = is_production or (is_local and not build)

    def valid_build_commit(value):
        # We don't care what the value is in local images
        if is_local:
            return True
        # When building, the value is required
        # to be written to the build-info.json
        elif build:
            return bool(value)
        # When running (on production), the value is forbidden
        # it was defined in the build-info.json
        elif is_production:
            return not bool(value)

    # Define metadata and define if the value is valid
    data = {
        # Docker tag is always required but often derived from other inputs
        'DOCKER_TAG': (tag, tag is not None),
        # Docker version and digest are mutually exclusive
        # exactly and only one should be set
        'DOCKER_VERSION': (version, valid_version_digest),
        'DOCKER_DIGEST': (digest, valid_version_digest),
        # Docker target can be set on local images,
        # but should be production for remote images.
        # Remote images are always built for production.
        'DOCKER_TARGET': (docker_target, valid_docker_target),
        # Docker commit and build are:
        # - optional for non production images
        # - forbidden on remote images (already defined in the build-info.json)
        'DOCKER_COMMIT': (docker_commit, valid_build_commit(docker_commit)),
        'DOCKER_BUILD': (docker_build, valid_build_commit(docker_build)),
    }

    errors = {}
    meta = {}

    for key, (value, valid) in data.items():
        # Add defined values to meta
        if value:
            meta[key] = value
        # Add invalid values to errors
        if not valid:
            errors[key] = value

    if len(errors.keys()):
        raise ValueError(
            f'\n{json.dumps(meta, indent=2)}\n'
            f'Invalid items: check setup.py for validations (build={build})'
            '\n• ' + '\n• '.join(errors.keys())
        )

    return meta