zot OCI registry
v0.1.10Read-only inspection of a zot OCI registry over its HTTP API: the OCI distribution endpoints (version check, catalog, tags, manifests) plus the zot extensions — registry config/health (mgmt), Prometheus metrics, and a GraphQL search query that returns per-repo size and a newest-image vulnerability summary. Optional basic-auth credentials are streamed over curl stdin; many zot deployments allow anonymous read.
curl
Install
emisar pack install
fetches this pack, re-validates it, and verifies its content hash against the
--hash
below — the exact bytes this page was rendered against, so a tampered copy is
rejected — before copying it into the runner's packs dir. The command reloads a
running daemon itself; no manual restart.
sudo emisar pack install zot --hash sha256:7d97984a45c0a07b7b1f097194372e460af2ce31cd3b60b27edcf8ee4691ccb2
Setup
Every action calls the zot HTTP API at
$ZOT_URL
via curl on the runner host. Optional basic-auth credentials "user:password" are read from
$ZOT_BASICAUTH
, base64-encoded, and sent as an Authorization header over curl stdin, so they never appear in the process arguments or the audit log.
Environment
Set these on the runner host, then add each name to
execution.inherit_env
so the value reaches the action.
-
ZOT_URLdefault http://127.0.0.1:5000Base URL of the zot registry — scheme, host, and port. Each action appends its path (e.g. /v2/, /v2/_catalog).
-
ZOT_BASICAUTHOptional user:password for registries that require auth; base64-encoded and sent as an Authorization header over curl stdin, never argv. Leave unset for anonymous-read registries.
Notes
-
Any of
ZOT_URL/ZOT_BASICAUTHyou set must also be allowlisted in the runner'sexecution.inherit_env— the action env is scrubbed to PATH/LANG/LC_ALL/TERM by default, so an env present on the host but not allowlisted is silently dropped (the action falls back to its local default or fails auth). - Every action is read-only: GET, plus POST only to the read-only search GraphQL extension. Push/delete of manifests and blobs, and userprefs writes, are deliberately excluded.
- The search/mgmt/metrics extensions require the full (extended) zot build — search/ui/mgmt are on by default; metrics must be enabled in config.
-
mgmt and metrics typically require auth and are denied to anonymous clients; set
ZOT_BASICAUTHfor those.
Verify it works
Runs zot.v2_base, a low-risk
read that confirms the pack can reach its target. Run it on the host once the pack
is installed; pack install runs it for
you.
sudo emisar pack verify zot
Install and configure a pack walks through the whole sequence on a host.
Actions 7 total
View on GitHub-
zot.catalog script low Low — read-only or trivially reversible
GET /v2/_catalog
List the repositories in the registry. Large registries paginate via the ?n=<count>&last=<repo> query parameters; this returns the first page. Use to inventory what is stored. Read-only.
View source on GitHub -
zot.manifest script low Low — read-only or trivially reversible
GET /v2/{repo}/manifests/{reference}
Read the image manifest for a repository at a given reference (a tag or a digest). Returns the layer/config descriptors and annotations for that image. Read-only.
View source on GitHub -
zot.metrics script low Low — read-only or trivially reversible
GET /metrics
Show Prometheus-format metrics for the registry via the zot metrics extension — request counts, storage, and runtime gauges. Requires the full (extended) build with the metrics extension enabled in config, and typically auth (set ZOT_BASICAUTH). Read-only.
View source on GitHub -
zot.mgmt script low Low — read-only or trivially reversible
GET /v2/_zot/ext/mgmt
Show registry configuration and health via the zot mgmt extension — the active config (extensions enabled, storage settings) and a health summary. The mgmt extension is on by default in the full build but requires auth and is denied to anonymous clients, so set ZOT_BASICAUTH. Read-only.
View source on GitHub -
zot.search script low Low — read-only or trivially reversible
POST /v2/_zot/ext/search (repo inventory + vuln summary)
List repository inventory with per-repo storage size and a newest-image vulnerability summary, via the zot search GraphQL extension. This is how you get per-repo storage size + CVE summary — zot has no plain storage-usage endpoint, and garbage collection is not inspectable over HTTP. The GraphQL query is read-only (a RepoListWithNewestImage read). Read-only.
View source on GitHub -
zot.tags script
GET /v2/{repo}/tags/list
List the tags available for a single repository. Use after the catalog to see which versions of an image are published. Read-only.
View source on GitHub -
zot.v2_base script low Low — read-only or trivially reversible
GET /v2/
Check the OCI distribution base endpoint. A 200 confirms the registry is up and speaking the v2 API, and the response advertises the supported distribution-spec version. Use as a reachability/version check.
View source on GitHub