Registries
A container registry stores container images. up needs one to pull base images from, and a git-source service needs one to push the built image to before it is deployed. Without a registry, builds have nowhere to deliver their output.
The configuration reference for the registries section lives under
Configuration; this page covers the background
and how to get a registry.
Common providers
You probably already have an account with one of the public providers:
- Docker Hub (
docker.io) : the default image source for most public images. Public repositories are free; private ones need a paid plan. - GitHub Container Registry (
ghcr.io) : free, and natural if your code lives on GitHub. Image names must start with your GitHub username or organisation name. - Quay (
quay.io) : a general-purpose registry from Red Hat.
Any of them works as a push target for builds. up registry add registers one with the control node:
up registry add ghcr.io --username deploy-bot --password $GHCR_TOKEN --default
See Configuration/Registries for the full knob reference.
A local development registry
For local development, a registry running on your own machine is enough, and it removes the need for external credentials. Run one with Podman or Docker:
podman run -d \
--name registry \
-p 5000:5000 \
-v registry-data:/var/lib/registry \
docker.io/library/registry:2
The optional registry UI gives you a web page to browse images:
podman run -d --name registry-ui -p 8080:80 \
-e NGINX_PROXY_PASS_URL=http://host.containers.internal:5000 \
-e SINGLE_REGISTRY=true \
docker.io/joxit/docker-registry-ui:latest
Then register it with up:
up registry add localhost:5000 --default
Plain-HTTP registries
A local registry like localhost:5000 serves plain HTTP, but Podman and
Docker both attempt HTTPS first. The node’s container runtime must be told to
trust the registry, or every pull fails. With Podman, mark the host insecure
in /etc/containers/registries.conf:
[[registry]]
location = "localhost:5000"
insecure = true
With Docker, add the host to the insecure-registries list in the daemon
configuration (/etc/docker/daemon.json) and restart the daemon.
For anything beyond local development, run the registry behind TLS on a real host instead of relying on an insecure connection.
One note on local registries: registry verification runs from the control
plane, so a loopback host registered there passes even though build nodes
reach it through a different address. If a build node cannot reach the
registry, verify from that host or pass --no-verify when adding.