This project aims to provide a simple and complete user interface for your private docker registry.
You have the choice between two versions, the standard interface (
joxit/docker-registry-ui:latest) and the static interface (
In the standard interface, there is no default registry, you need to add your own within the UI. With this version, you can manage more than one registry server but all the environment variables will be unavailable. All registries will be stored in the local storage of your browser. No configuration is needed when you launch the UI.
In the static interface, it will connect to a single registry and will not change. The configuration is done at the start of the interface, when you use the docker images whose tags contain the
static keyword. With this version, you can manage only one registry and all environment variables will be available.
docker pullcommand to clipboard (see #42).
https://joxit.dev/docker-registry-ui/demo?url=https://registry.example.com) standard interface.
joxit/docker-registry-ui:staticas reverse proxy (with
REGISTRY_URLenvironment variable) to your docker registry (This will avoid CORS) static interface.
REGISTRY_URL(see #28) static interface.
NGINX_PROXY_HEADER_*(see #89) static interface
SHOW_CONTENT_DIGEST(values are: [
true) (see #126) static interface.
CATALOG_ELEMENTS_LIMIT(see #127) static interface.
latesttag was the first version of the project, one UI for many docker registries. The
statictag allows you to have an interface for a single registry and also allows you select your features.
Hostis set to
manifest(it's a sha of the content). So when you delete a tag, this will delete all tags of this image with the same SHA/manifest.
Need more informations ? Try my examples or open an issue.
The docker image contains the source code and nginx in order to serve the docker-registry-ui. Please remember the difference between the standard interface (
latest tag) and static interface (
You can run the standard interface see the website on your 80 port. You will be able to use the interface for many registry servers, but all the configuration via environment variables from the static interface will be unavailable.
docker run -d -p 80:80 joxit/docker-registry-ui:latest
Some env options are available for use this interface for only one server.
URL: set the static URL to use (You will need CORS configuration). Example:
REGISTRY_URL: your docker registry URL to contact (CORS configuration is not needed). Example:
http://my-docker-container:5000. (Can't be used with
URL, since 0.3.2).
DELETE_IMAGES: if this variable is empty or
false, delete feature is deactivated. It is activated otherwise.
REGISTRY_TITLE: Set a custom title for your user interface when using
PULL_URL: Set a custom url for the docker pull command, this is useful when you use
REGISTRY_URLand your registry is on a different host (since 1.1.0).
NGINX_PROXY_HEADER_*: Set custom headers for your docker registry, usefull when you want to add your credentials. (Can be use only with
SHOW_CONTENT_DIGEST: Show content digest in docker tag list. Default:
CATALOG_ELEMENTS_LIMIT: Limit the number of elements in the catalog page. Default:
docker run -d -p 80:80 -e URL=http://127.0.0.1:5000 -e DELETE_IMAGES=true joxit/docker-registry-ui:static
REGISTRY_URL, this will add a proxy to your registry.
Your registry will be accessible here :
http://127.0.0.1/v2, this will avoid CORS errors (see #25).
registry:2 will communicate, both containers should be in the same network or use your private IP.
docker network create registry-ui-net docker run -d --net registry-ui-net --name registry-srv registry:2 docker run -d --net registry-ui-net -p 80:80 -e REGISTRY_URL=http://registry-srv:5000 -e DELETE_IMAGES=true -e REGISTRY_TITLE="My registry" joxit/docker-registry-ui:static
Your server should be configured to accept CORS.
If your docker registry does not need credentials, you will need to send this HEADER:
If your docker registry need credentials, you will need to send these HEADERS:
http: headers: Access-Control-Allow-Origin: ['<your docker-registry-ui url>'] Access-Control-Allow-Credentials: [true] Access-Control-Allow-Headers: ['Authorization', 'Accept'] Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS'] # Optional
For deleting images, you need to activate the delete feature in your registry:
storage: delete: enabled: true
And you need to add these HEADERS:
http: headers: Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] Access-Control-Expose-Headers: ['Docker-Content-Digest']
If you are running the static interface don't forget the environment variable
Example of docker registry configuration file:
version: 0.1 log: fields: service: registry storage: delete: enabled: true cache: blobdescriptor: inmemory filesystem: rootdirectory: /var/lib/registry http: addr: :5000 headers: X-Content-Type-Options: [nosniff] Access-Control-Allow-Origin: ['http://127.0.0.1:8001'] Access-Control-Allow-Methods: ['HEAD', 'GET', 'OPTIONS', 'DELETE'] Access-Control-Allow-Headers: ['Authorization', 'Accept'] Access-Control-Max-Age:  Access-Control-Allow-Credentials: [true] Access-Control-Expose-Headers: ['Docker-Content-Digest'] auth: htpasswd: realm: basic-realm path: /etc/docker/registry/htpasswd
If you do not want to install the docker-registry-ui on your server, you may check out the Electron standalone application.