Skip to main content

Images and allow-lists

What runs​

ImageRepositoryChosen by
Operatorghcr.io/fyannk/pgtoolbox-operatorimage.repository and image.tag (default: the chart's appVersion)
Consoleghcr.io/fyannk/pgtoolbox-consoleconsole.image.*
Evidence agentghcr.io/fyannk/pgtoolbox-evidence-agentoperator.evidenceAgent.image, else imageRepository at appVersion
pgAdminghcr.io/fyannk/pgadmin, hardened, pinned by digest in the operatoroperator.pgAdmin.image (PGADMIN_IMAGE)
OpenShift oauth-proxyquay.io/openshift/origin-oauth-proxy:4.18, pinned by digestoperator.oauthProxyImage (OAUTH_PROXY_IMAGE)

The operator image is also the one copied into every pgAdmin Pod by an init container, so the credential sidecar and the registration Jobs run the operator's own binary under pgAdmin's UID.

All images are published to ghcr.io/fyannk by the release workflow, signed, and listed in the release's digests.txt (verify). Prefer digests everywhere in production.

spec.image​

PgAdmin.spec.image, PgAdmin.spec.auth.openshiftOAuthProxy.image and EvidenceAgent.spec.image take the same shape (ImageSpec): repository (required), tag and/or digest (at least one), pullPolicy, pullSecrets.

  • A digest is what the Pod runs; the tag is then informative.
  • Pull policy defaults to IfNotPresent with a digest and Always with a tag alone.
  • A tag alone is accepted, but the resolved reference in status.image shows that it is not pinned.
  • Omitted, the operator's default applies, echoed in status.image.

Why images are gated​

The agent Pod mounts the object-store credentials; the pgAdmin Pod holds database credentials. Whoever can choose the image of either runs code with those credentials. The installer bounds the choice, and you can add an admission gate.

The allow-lists (always on)​

  • EvidenceAgent.spec.image: --evidence-agent-image-repositories (chart: operator.evidenceAgent.imageRepositories).
  • PgAdmin.spec.image and the oauth-proxy image: --pgadmin-image-repositories or PGADMIN_IMAGE_REPOSITORIES (chart: operator.pgAdmin.imageRepositories).

Each is a comma list of repositories: an exact repository, or a prefix ending in /. Empty means each image's default repository only; set it to your mirror when PGADMIN_IMAGE or OAUTH_PROXY_IMAGE point at one. A custom resource outside the list is ConfigurationValid=False with reason ImageNotAllowed and nothing is rendered. With no spec.image the default is used; for an EvidenceAgent with no default either, the reason is ImageRequired.

The admission policy​

operator.admissionPolicy.enabled (on by default in the chart; kustomize and OLM do not apply it, see security) renders a ValidatingAdmissionPolicy (CEL, no webhook) under which only the listed users and groups may set spec.image on a PgAdmin or an EvidenceAgent. Everyone else uses the operator's default. It adds the requester's identity, which the allow-list cannot see.

The same policy carries the rule that keeps a PgToolBoxConsole or PgAdmin from naming a Secret its editor cannot read; see Security.

Air-gapped and mirrored registries​

Set the image values to your mirror (global.imageRegistry prefixes the console; the operator values are full references). The OLM CSV's relatedImages lists the images for oc mirror. On OpenShift, set operator.oauthProxyImage to the image from the cluster's release payload.