Connecting a registry
Docker Hub, GHCR, GitLab, Quay, ECR, Artifact Registry, ACR and other OCI registries.
A registry connection holds the credential Interopt pulls your images with. Add one from Settings → Integrations → Container registries. Connecting a registry needs the owner or admin role.
Every connection only needs to read images. A credential is checked the first time Interopt lists or pulls an image with it, and the connection then shows Connected or the registry's refusal.
Docker Hub
Create a personal access token with Read-only access in Docker Hub's account settings, and enter it with your Docker Hub username.
Public images can be pulled without a connection, but anonymous pulls share Docker Hub's rate limit with every other anonymous pull from Interopt's address, so connect an account for the images you track.
GitHub Container Registry
Create a classic personal access token with only the read:packages scope,
and enter it with the GitHub username that owns it. The account needs read
access to the packages.
GitHub Container Registry does not accept fine-grained tokens or GitHub App tokens for pulls, so the GitHub code host connection can't be used here.
GitLab
Either:
- A deploy token with the
read_registryscope, created on the project or group. Enter its username and token. This is the narrowest credential. - The workspace's GitLab connection. It pulls as the connected account, from every project that account can read.
For a self-managed GitLab, enter your instance's registry host.
Quay
Create a robot account with Read permission on the repositories to scan, and enter the robot's name and token.
Other OCI registries
Harbor, Nexus, JFrog Artifactory, a self-hosted Distribution registry, or any other registry that speaks the OCI distribution API. Enter the registry host and either a username and password or token, or a bearer token.
The registry must be reachable over the internet. Private network addresses are refused. If the registry only accepts listed addresses, allow the address shown on the Container registries page.
Amazon ECR
ECR images are pulled through a connected AWS account. Pulling reads image contents, which the read-only posture role never does, so it is a separate permission you add on purpose:
- CloudFormation: update the Interopt stack to the latest template and set
ContainerImagePulltotrue. To allow only some repositories, list their ARNs inImagePullRepositoryArns; by default every repository in the account can be pulled. - Terraform: set
image_pull = true, and optionallyimage_pull_repository_arns. - A role you made by hand: add the policy in
manual-image-pull-policy.json, published with the Interopt templates, to theInteroptScanrole.
The permission adds ecr:GetAuthorizationToken, which AWS only grants
account-wide, and ecr:BatchGetImage, ecr:GetDownloadUrlForLayer,
ecr:BatchCheckLayerAvailability and ecr:ListImages on the chosen
repositories. Then add a connection of type Amazon ECR, choose the account,
and enter the registry host, such as
123456789012.dkr.ecr.eu-west-1.amazonaws.com.
Google Artifact Registry
Images in Artifact Registry, and Container Registry hosts such as gcr.io, are
pulled through a connected Google Cloud project. Grant
roles/artifactregistry.reader to the workspace's Interopt service account,
on the project or only on the repositories to scan. Then add a connection of
type Artifact Registry, choose the project, and enter the registry host,
such as europe-west4-docker.pkg.dev.
Azure Container Registry
ACR images are pulled through a connected Azure tenant. Assign the AcrPull
role on the registry to the app registration you connected Azure with. Then add
a connection of type Azure Container Registry, choose the subscription, and
enter the registry host, such as acmeprod.azurecr.io.
How credentials are used
Credentials are stored encrypted. The job that pulls an image receives a credential for that one registry, only while it runs, and refuses to send it to any other host. For ECR, Artifact Registry and ACR, Interopt mints a short-lived registry token from your cloud connection each time; the cloud credential itself never reaches the job.
