The quickest way to run something: any image from Docker Hub, GitHub Container Registry or another registry the servers can pull from.
+ Create → Service → Container image, then enter the image, e.g. nginx:1.27, postgres:16 or ghcr.io/acme/api:2.3.
EXPOSE), or 8080. The app also gets a PORT variable.redis-server --appendonly yes.Change the image (say from :1.2 to :1.3) under the service's Settings: that starts a deployment. To fetch a moving tag like :latest again, press Deploy on the service's page.
Give the organization a login for the registry, and its private images are pulled with it: services that run one, and builds whose Dockerfile starts FROM one.
alf registries add ghcr.io --username you
The token is asked for and not shown (or piped in: echo "$GHCR_TOKEN" | alf registries add ghcr.io --username you, for CI). In the dashboard: Settings → Registries. The registry is its host, as images from it start with: ghcr.io, registry.gitlab.com, registry.example.com:5000, or docker.io for Docker Hub. One login per registry; adding one again replaces it. Admins add and remove them.
| Registry | Username | Token |
|---|---|---|
GitHub (ghcr.io) | your GitHub username | a personal access token (classic) with read:packages |
Docker Hub (docker.io) | your Docker ID | an access token, read-only |
GitLab (registry.gitlab.com) | the token's username | a deploy token with read_registry |
A private image pulled without a login fails with pull access denied or unauthorized. The deployment says which registry needs a login.
alf registries lists the logins, and alf registries remove ghcr.io takes one away.