The simplest and most complete UI for your private registry
Go to file
Jones Magloire 7296c2e727
Add Contributor Covenant Code of Conduct
2019-09-28 22:27:52 +02:00
.github/ISSUE_TEMPLATE Add issue templates and contributors.md 2019-09-24 22:41:38 +02:00
bin Release v1.3.0: pagination in taglist and indent aggregated entries 2019-07-18 01:13:57 +02:00
demo Update project page/README and example issue-75; rebuild project 2019-04-27 22:04:06 +02:00
dist [remove-image] speed up removal process 2019-09-21 12:20:53 +02:00
examples Release v1.2.3: Custom header supports 2019-07-04 23:09:11 +02:00
nginx feat: Supports custom headers when the ui is used as proxy 2019-06-24 23:54:21 +02:00
src [remove-image] speed up removal process 2019-09-21 12:20:53 +02:00
.dockerignore [docker-multi-stage] Add multi-stage-build for alpine version 2018-12-27 00:18:51 +01:00
.gitignore Update project page/README and example issue-75; rebuild project 2019-04-27 22:04:06 +02:00
CODE_OF_CONDUCT.md Add Contributor Covenant Code of Conduct 2019-09-28 22:27:52 +02:00
CONTRIBUTORS.md fix: contributors list 2019-09-26 22:03:08 +02:00
Dockerfile [docker-multi-stage] Add multi-stage-build for alpine version 2018-12-27 00:18:51 +01:00
Dockerfile.static Add debian image version (joxit/docker-registry-ui:debian) 2018-03-18 23:58:36 +01:00
LICENSE Initial commit 2016-04-09 21:40:26 +02:00
README.md Fix typo 2019-09-12 14:58:52 +02:00
_config.yml Update project page/README and example issue-75; rebuild project 2019-04-27 22:04:06 +02:00
arm32v7-static.dockerfile Upgrade to v0.4.0 2018-07-24 00:05:45 +02:00
arm32v7.dockerfile Add arm32v7 support 2018-04-05 00:08:34 +02:00
arm64v8-static.dockerfile Upgrade to v0.4.0 2018-07-24 00:05:45 +02:00
arm64v8.dockerfile Add arm64v8 support 2018-07-18 22:59:07 +02:00
debian-static.dockerfile Upgrade to v0.4.0 2018-07-24 00:05:45 +02:00
debian.dockerfile Add debian image version (joxit/docker-registry-ui:debian) 2018-03-18 23:58:36 +01:00
docker-registry-ui.gif Release v1.3.0: pagination in taglist and indent aggregated entries 2019-07-18 01:13:57 +02:00
gulpfile.js New script `utils` for global static functions 2019-05-21 00:18:24 +02:00
index.md Update project page/README and example issue-75; rebuild project 2019-04-27 22:04:06 +02:00
package.json Release v1.3.0: pagination in taglist and indent aggregated entries 2019-07-18 01:13:57 +02:00
screenshot.png Release v1.0.0: Image aggregation and catalog UI revamped 2019-01-09 22:56:05 +01:00
static.dockerfile [docker-multi-stage] Add multi-stage-build for alpine version 2018-12-27 00:18:51 +01:00

README.md

title
Project Page

Docker Registry UI

Stars Pulls

Overview

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 and the static interface.

In the standard interface, there is no default registry, you need to add your own within the UI. You can manage more than one registry server. 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.

This web user interface uses Riot the react-like user interface micro-library and riot-mui components.

Project Page, Live Demo Examples

preview

Features

  • List all your repositories/images.
  • List all tags for a image.
  • Sort the tag list with number compatibility (see #46).
  • Use a secured docker registry.
  • Display image size (see #30).
  • Multi arch supports, Alpine and Debian based images with supports for arm32v7 and arm64v8.
  • Copy docker pull command to clipboard (see #42).
  • Show sha256 for specific tag (hover image tag).
  • Display image creation date (see #49)
  • Display image history (see #58 & #61).
  • Image aggregation (see #56).
  • Display image/tag count (see #56 issue comment).
  • Select multiple tags to delete (see #29).
  • Select all tags with ALT + Click to delete (see #80).
  • One interface for many registries standard interface.
  • Share your docker registry with query parameter url (e.g. https://joxit.dev/docker-registry-ui/demo?url=https://registry.example.com) standard interface.
  • Use joxit/docker-registry-ui:static as reverse proxy (with REGISTRY_URL environment variable) to your docker registry (This will avoid CORS) static interface.
  • Add Title when using REGISTRY_URL (see #28) static interface.
  • Customise docker pull command on static registry UI (see #71) static interface.
  • Add custom header via environment variable and file (see #89) static interface

FAQ

  • 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.

Need more informations ? Try my examples or open an issue.

Getting Started

Basic

First you need node and npm in order to download dependencies.

git clone https://github.com/Joxit/docker-registry-ui.git
cd docker-registry-ui
npm install

Now you can open index.html with your browser or use a http-server

npm install -g http-server
http-server

Docker

The docker contains the source code and a node webserver in order to serve the docker-registry-ui.

Get the docker image

You can get the image in three ways

From sources with this command:

git clone https://github.com/Joxit/docker-registry-ui.git
# Alpine
docker build -t joxit/docker-registry-ui:latest docker-registry-ui
docker build -t joxit/docker-registry-ui:static -f docker-registry-ui/static.dockerfile docker-registry-ui
# Debian
docker build -t joxit/docker-registry-ui:debian -f docker-registry-ui/debian.dockerfile docker-registry-ui
docker build -t joxit/docker-registry-ui:static -f docker-registry-ui/debian-static.dockerfile docker-registry-ui

Or build with the url:

# Alpine
docker build -t joxit/docker-registry-ui:latest github.com/Joxit/docker-registry-ui
docker build -t joxit/docker-registry-ui:static -f static.dockerfile github.com/Joxit/docker-registry-ui
# Debian
docker build -t joxit/docker-registry-ui:debian -f debian.dockerfile github.com/Joxit/docker-registry-ui
docker build -t joxit/docker-registry-ui:debian-static -f debian-static.dockerfile github.com/Joxit/docker-registry-ui

Or pull the image from docker hub:

# Alpine
docker pull joxit/docker-registry-ui:latest
docker pull joxit/docker-registry-ui:static
# Debian
docker pull joxit/docker-registry-ui:debian
docker pull joxit/docker-registry-ui:debian-static

Run the docker

To run the docker and see the website on your 80 port, try this:

docker run -d -p 80:80 joxit/docker-registry-ui

Run the static interface

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: http://127.0.0.1:5000. (Required)
  • 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 REGISTRY_URL (since 0.3.4).
  • PULL_URL: Set a custom url for the docker pull command, this is useful when you use REGISTRY_URL and your registry is on a different host (since 1.1.0).

Example with URL option.

docker run -d -p 80:80 -e URL=http://127.0.0.1:5000 -e DELETE_IMAGES=true joxit/docker-registry-ui:static

Example with 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). Be careful, joxit/docker-registry-ui and 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

There are some examples with docker-compose and docker-registry-ui as proxy here or docker-registry-ui as standalone here.

Using CORS

Your server should be configured to accept CORS.

If your docker registry does not need credentials, you will need to send this HEADER:

Access-Control-Allow-Origin: ['*']

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-Methods: ['HEAD', 'GET', 'OPTIONS'] # Optional

Using delete

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']

Registry example

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']
    Access-Control-Max-Age: [1728000]
    Access-Control-Allow-Credentials: [true]
    Access-Control-Expose-Headers: ['Docker-Content-Digest']
auth:
  htpasswd:
    realm: basic-realm
    path: /etc/docker/registry/htpasswd

All examples