Docker Registry User Interface
Overview
This project aims to provide a simple and complete user interface for your private docker registry. You can customize the interface with various options. The major option is SINGLE_REGISTRY
which allows you to disable the dynamic selection of docker registeries (same behavior as the old static tag).
You may need the migration guide from 1.x to 2.x or the 1.x readme
This web user interface uses Riot the react-like user interface micro-library and riot-mui components.
If you like my work and want to support it, don't hesitate to sponsor me.
Supported Docker tags
latest
: image with the latest release of Docker Registry UI based onnginx:alpine
latest-debian
: image with the latest release of Docker Registry UI based onnginx:debian
main
,master
: image with the beta version of Docker Registry UI based onnginx:alpine
main-debian
,master-debian
: image with the beta version of Docker Registry UI based onnginx:debian
2
: image with the latest release of Docker Registry UI v2 (includes latest minor and patch version)2.x
: image with the latest release of Docker Registry UI v2.x (includes latest patch version)2.x.y
: image with the specific release of Docker Registry UI v2.x.y
Project Page, Live Demo, Examples, Helm Chart
Hidden Features
- Many ways to delete multiple images at once
- Select multiple tags to delete with checkboxes (see #29 and #79). Since 1.2.0
- Select all tags of the page with
ALT + Click
on the indeterminate checkbox (see #80 and #81). Since 1.2.1 - Select all contigous tags between two tags with
Shift + Click
on the first tag thenShift + Click
on the second tag (see #287). Since 2.4.0
- Show sha256 for specific tag (hover image tag).
- Sort the tag list with number compatibility (see #45 and #46). Since 0.4.0
- Share your docker registry UI without installation or when you are deploying a UI with
SINGLE_REGISTRY=false
.- Use the public demo and the query parameter
url
(e.g.https://joxit.dev/docker-registry-ui/demo?url=https://registry.example.com
). If you need credentials on your private registry, you must set theAccess-Control-Allow-Origin
tohttps://joxit.dev
. - You can use a single interface with many registry, add them in the menu in the top right of the page.
- Use the public demo and the query parameter
- Filter images and tags with the search bar.
- You can select the search bar with the shortcut
CRTL + F
orF3
. When the search bar is already focused, the shortcut will fallback to the default behavior (see #213). Since 2.1.0
- You can select the search bar with the shortcut
- Multi arch support in history page (see #130 and #134). Since 1.5.0
- Show the content of the dockerfile (see #286). Since 2.4.0
- The UI will cache requests from your registry, such as blobs and some manifests (URL with
sha256:
).
Checkout all options in Available options section.
FAQ
- What is the difference between
SINGLE_REGISTRY=false
andSINGLE_REGISTRY=true
options ?- When
SINGLE_REGISTRY
is set to false, a menu appears on the interface allowing you to dynamically change docker registry URLs.
- When
- Why, when I delete all tags of an image, the image is still in the UI ?
- This is a limitation of docker registry, the garbage collector don't remove empty images. If you want to delete dangling images, you will need to delete the folder in your registry data. (see #77)
- Why the image size in the UI is not the same as displayed during
docker images
?- The UI displays the compressed size of the image and not the extracted size version.
- Can I use HTTPS on the UI ?
- Yes, put your favourite reverse proxy on the front of the UI. Your reverse proxy will take care of HTTPS connection.
- Does the UI support authentication ?
- Yes, but it supports only basic auth. It's a simple standalone frontend, it will use your browser window for authentication.
- Can I use the UI and docker client with an insecure registry (registry url without https) ?
- Yes you can, you must first configure your docker client. (see #76)
- What does Mixed Content error mean ?
- This means you are using a UI with HTTPS and your registry is using HTTP (unsecured). When you are on a HTTPS site, you can't get HTTP content. Upgrade you registry with a HTTPS connection.
- Why the default nginx
Host
is set to$http_host
? - Why OPTIONS (aka preflight requests) and DELETE fails with 401 status code (using Basic Auth) ?
- This is caused by a bug in docker registry, it returns 401 status requests on preflight requests, this breaks W3C preflight-request specification. I suggest to have your UI on the same domain than your registry e.g. registry.example.com/ui/ or use
NGINX_PROXY_PASS_URL
or configure a nginx/apache/haproxy in front of your registry that returns 200 on each OPTIONS requests. (see #104, #204, #207, #214, #266).
- This is caused by a bug in docker registry, it returns 401 status requests on preflight requests, this breaks W3C preflight-request specification. I suggest to have your UI on the same domain than your registry e.g. registry.example.com/ui/ or use
- Can I use the docker registry ui as a standalone application (with Electron) ?
- I deleted images through the UI, but they are still present on the server. How can I delete them?
- Why when I delete one tag, all tags with the same SHA are deleted ?
- This a docker registry API limitation, there is only one way to delete images with tag, it's by its
name
and itsmanifest
(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.
- This a docker registry API limitation, there is only one way to delete images with tag, it's by its
- Can I run the container with an unprivileged user ?
- Can I use the UI with a docker hub mirror and show
library/*
images ?- Yes but it is at your own risk using two regstry servers, check the comment #155.
- How to fix CORS issue on s3 bucket ?
- You should add a CORS Policy on your bucket, check the issue #193.
- Why my docker registry server is returning an error
pagination number invalid
?- Since docker registry server 2.8.2 there is default limit of 1000 images in catalog. If you need more images update the configuration
REGISTRY_CATALOG_MAXENTRIES
with your max value and check the issue #306.
- Since docker registry server 2.8.2 there is default limit of 1000 images in catalog. If you need more images update the configuration
- I'm using
NGINX_PROXY_PASS_URL
, my registry server has been recreated and the UI cannot connect with the message[error] 176#176: *2 connect() failed (111: Connection refused) while connecting to upstream
, what can I do?- Nginx get the IP of all addresses only once at runtime, since your container has been recreated, its IP changed too. To prevent this kind of issue, you may use the option
NGINX_RESOLVER
and set to127.0.0.11
.
- Nginx get the IP of all addresses only once at runtime, since your container has been recreated, its IP changed too. To prevent this kind of issue, you may use the option
Need more informations ? Try my examples or open an issue.
Available options
You can run the container with the unprivileged user nginx
, see the discussion #224.
Some env options are available for use this interface for only one server (when SINGLE_REGISTRY=true
).
REGISTRY_URL
: The default url of your docker registry. You may need CORS configuration on your registry. This is usually the domain name or IP of your registry reachable by your computer (e.ghttp://registry.example.com
). (default: derived from the hostname of your UI).REGISTRY_TITLE
: Set a custom title for your user interface. (default: value derived fromREGISTRY_URL
) (see #28 and #32). Since 0.3.4PULL_URL
: Set a custom url when you copy thedocker pull
command (see #71). (default: value derived fromREGISTRY_URL
). Since 1.1.0DELETE_IMAGES
: Set if we can delete images from the UI. (default:false
)SHOW_CONTENT_DIGEST
: Show/Hide content digest in docker tag list (see #126 and #131). (default:false
). Since 1.4.9CATALOG_ELEMENTS_LIMIT
: Limit the number of elements in the catalog page (see #39, #127, #132) and #306. (default:1000
). Since 1.4.9SINGLE_REGISTRY
: Remove the menu that show the dialogs to add, remove and change the endpoint of your docker registry. (default:false
). Since 2.0.0NGINX_PROXY_PASS_URL
: Update the default Nginx configuration and set the proxy_pass to your backend docker registry (this avoid CORS configuration). This is usually the name of your registry container in the formhttp://registry:5000
. Since 2.0.0NGINX_PROXY_HEADER_*
: Update the default Nginx configuration and set custom headers for your backend docker registry via environment variable and file (/etc/nginx/.env
). Only whenNGINX_PROXY_PASS_URL
is used (see #89). Since 1.2.3NGINX_PROXY_PASS_HEADER_*
: Update the default Nginx configuration and forward custom headers to your backend docker registry via environment variable and file (/etc/nginx/.env
). Only whenNGINX_PROXY_PASS_URL
is used (see #206). Since 2.1.0NGINX_LISTEN_PORT
: Listen on a port other than 80, you can also change the default user and set to nginx--user nginx
(see #224 and #234). (default:80
when the user is root,8080
otherwise). Since 2.2.0NGINX_RESOLVER
: Addresolver
directive to the nginx configuration for dynamic dns resolving. The value when you are using a docker network is127.0.0.11
, you can set a custom DNS server too with a valid time. This is not needed when you are using kubernetes. (see #333 and #339). (default: ``). Since 2.5.5DEFAULT_REGISTRIES
: List of comma separated registry URLs (e.ghttp://registry.example.com,http://registry:5000
), available only whenSINGLE_REGISTRY=false
(see #219). (default:READ_ONLY_REGISTRIES
: Deactivate dialog for remove and add new registries, available only whenSINGLE_REGISTRY=false
(see #219). (default:false
). Since 2.1.0SHOW_CATALOG_NB_TAGS
: Show number of tags per images on catalog page and hide images with 0 tags. This will produce + nb images requests, not recommended on large registries (see #161 and #239). (default:false
). Since 2.2.0HISTORY_CUSTOM_LABELS
: Expose custom labels in history page, custom labels will be processed like maintainer label (see #160 and #240). Since 2.2.0USE_CONTROL_CACHE_HEADER
: UseControl-Cache
header and set tono-store, no-cache
. This will avoid some issues on multi-arch images (see #260 and #265). This option requires registry configuration:Access-Control-Allow-Headers
withCache-Control
. (default:false
). Since 2.3.0