Files
railiance-apps/tools/check-oci-image.sh

81 lines
2.0 KiB
Bash
Executable File

#!/usr/bin/env bash
set -euo pipefail
image_ref="${1:-}"
if [[ -z "$image_ref" ]]; then
echo "usage: $0 <registry/repository:tag>" >&2
exit 2
fi
failures=()
try_tool() {
local name="$1"
shift
if ! command -v "$name" >/dev/null 2>&1; then
return 1
fi
local output
if output="$("$@" 2>&1 >/dev/null)"; then
echo "ok: found image manifest with $name: $image_ref"
exit 0
fi
failures+=("$name: $output")
return 1
}
try_registry_api() {
if ! command -v curl >/dev/null 2>&1; then
return 1
fi
local ref_no_digest="${image_ref%@*}"
local ref_without_tag tag registry repo url output
if [[ "$ref_no_digest" != *:* ]]; then
failures+=("registry-api: image ref must include an explicit tag")
return 1
fi
tag="${ref_no_digest##*:}"
ref_without_tag="${ref_no_digest%:*}"
registry="${ref_without_tag%%/*}"
repo="${ref_without_tag#*/}"
if [[ -z "$registry" || -z "$repo" || "$registry" == "$repo" ]]; then
failures+=("registry-api: image ref must include registry and repository")
return 1
fi
url="https://${registry}/v2/${repo}/manifests/${tag}"
if output="$(curl -fsSL \
-H "Accept: application/vnd.oci.image.index.v1+json" \
-H "Accept: application/vnd.oci.image.manifest.v1+json" \
-H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
-H "Accept: application/vnd.docker.distribution.manifest.v2+json" \
-o /dev/null "$url" 2>&1)"; then
echo "ok: found image manifest with registry API: $image_ref"
exit 0
fi
failures+=("registry-api: $output")
return 1
}
try_tool skopeo skopeo inspect --raw "docker://${image_ref}" || true
try_tool crane crane manifest "$image_ref" || true
try_tool docker docker manifest inspect "$image_ref" || true
try_registry_api || true
echo "ERROR: image manifest not found or not accessible: $image_ref" >&2
if ((${#failures[@]} > 0)); then
printf '%s\n' "${failures[@]}" >&2
else
echo "No supported manifest inspection tool was available." >&2
fi
exit 1