A modern, lightweight web interface for browsing and managing Docker container registries.
5.5K
A modern, lightweight web interface for browsing and managing Docker container registries. Built with Nuxt 4 (Vue 3 + TypeScript) and designed to work seamlessly with any Docker Registry HTTP API v2 compliant registry.
docker pull commands with the correct registry URL
The easiest way to use Registry UI is with the pre-built Docker image from Docker Hub.
Create a docker-compose.yml file:
services:
registry:
image: registry:3.0.0
environment:
REGISTRY_STORAGE_DELETE_ENABLED: "true" # Enable image deletion
ports:
- "5000:5000"
volumes:
- ./registry-data:/var/lib/registry
registry-ui:
image: byrdal/registry-ui:latest
environment:
REGISTRY_URL: http://registry:5000 # Internal API URL
REGISTRY_PUBLIC_URL: localhost:5000 # Public pull URL shown in UI
REGISTRY_TITLE: "My Container Registry" # Optional: custom title
ports:
- "3000:3000"
volumes:
- ./registry-ui-data:/data
Then start both services:
docker-compose up -d
Access the UI at http://localhost:3000
If you already have a Docker registry running:
docker run -d \
-p 3000:3000 \
-e REGISTRY_URL=http://your-registry:5000 \
-e REGISTRY_PUBLIC_URL=registry.example.com:5000 \
-e REGISTRY_TITLE="My Registry" \
-v ./data:/data \
byrdal/registry-ui:latest
Configure Registry UI using environment variables:
| Variable | Default | Description |
|---|---|---|
REGISTRY_URL | http://registry:5000 | Internal Docker Registry API URL (for backend communication) |
REGISTRY_PUBLIC_URL | localhost:5000 | Public-facing registry URL shown in pull commands |
REGISTRY_TITLE | Registry UI | Page title and header displayed in the UI |
REGISTRY_USERNAME | (empty) | Optional: Basic auth username for private registries |
REGISTRY_PASSWORD | (empty) | Optional: Basic auth password for private registries |
DB_PATH | /data/registry.db | SQLite database file location |
CRON_SCHEDULE | */10 * * * * | How often to sync with registry (cron format) |
REGISTRY_URL: Used by the backend to communicate with the Docker Registry API (e.g., http://registry:5000 in Docker networks)REGISTRY_PUBLIC_URL: The URL users should use in their docker pull commands (e.g., registry.example.com, localhost:5000)docker run -d \
-p 5000:5000 \
--name registry \
-v ./registry-data:/var/lib/registry \
registry:3.0.0
To enable image deletion through the UI:
docker run -d \
-p 5000:5000 \
--name registry \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-v ./registry-data:/var/lib/registry \
registry:3.0.0
For production environments with basic authentication:
# Create htpasswd file
docker run --rm --entrypoint htpasswd registry:3.0.0 -Bbn username password > htpasswd
# Run registry with authentication
docker run -d \
-p 5000:5000 \
--name registry \
-e REGISTRY_AUTH=htpasswd \
-e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
-e REGISTRY_AUTH_HTPASSWD_REALM="Registry Realm" \
-e REGISTRY_STORAGE_DELETE_ENABLED=true \
-v ./htpasswd:/auth/htpasswd \
-v ./registry-data:/var/lib/registry \
registry:3.0.0
Then configure Registry UI with credentials:
docker run -d \
-p 3000:3000 \
-e REGISTRY_URL=http://registry:5000 \
-e REGISTRY_PUBLIC_URL=localhost:5000 \
-e REGISTRY_USERNAME=username \
-e REGISTRY_PASSWORD=password \
-v ./data:/data \
byrdal/registry-ui:latest
The dashboard shows all repositories with:
Click on any repository name to view:
REGISTRY_STORAGE_DELETE_ENABLED=trueNote: Deletion removes the manifest. To reclaim disk space, you must also run garbage collection on the registry:
docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
save-exact=true configured)git clone https://github.com/byrdal/registry-ui.git
cd registry-ui
npm install
docker run -d -p 4000:5000 -v ./.data/registry:/var/lib/registry -e REGISTRY_STORAGE_DELETE_ENABLED=true registry:3.0.0
DB_PATH="./.data/db/registry.db" node ./scripts/migrate-db.mjs
DB_PATH="./.data/db/registry.db" \
REGISTRY_URL="http://localhost:4000" \
node ./scripts/refresh-registry.mjs
NUXT_DB_PATH="./.data/db/registry.db" \
NUXT_REGISTRY_URL="http://localhost:4000" \
NUXT_PUBLIC_REGISTRY_PUBLIC_URL="localhost:4000" \
NUXT_PUBLIC_REGISTRY_TITLE="Dev Registry" \
npm run dev
Access the development server at http://localhost:3000
npm run build
npm start # Runs the built server
registry-ui/
├── scripts/
│ ├── migrate-db.mjs # Database schema setup
│ ├── refresh-registry.mjs # Registry sync script
│ └── db-schema.mjs # SQLite schema definition
├── server/
│ ├── utils/db.ts # Database connection singleton
│ └── api/ # Nitro API routes
│ ├── repos.get.ts # List all repositories
│ └── repos/[slug]/
│ ├── tags.get.ts # Get repository images
│ └── tags/[digest].delete.ts # Delete image
├── pages/
│ ├── index.vue # Dashboard
│ └── repos/[slug].vue # Repository detail
└── layouts/
└── default.vue # Shared layout
useFetch() and display the dataThe UI never directly modifies the registry data — it only reads from it and sends delete commands when requested.
MIT
Contributions are welcome! Please feel free to submit a Pull Request.
Content type
Image
Digest
sha256:6d0162b66…
Size
87.4 MB
Last updated
1 day ago
docker pull byrdal/registry-ui