Public | Automated Build

Last pushed: 2 months ago
Short Description
As simple as possible docker registry frontend (UI) for your private docker registry
Full Description


As simple as possible frontend for your private docker registry



  • V2 registries support only (secure, self-signed and insecure, DNS and IP:PORT)
  • internal DB (BoltBD) gives it ability to store info, and as a result it responses much faster than after direct api call, and can provide more data
  • app can parse, store and show info from registry such as:
    • image layers info:
      • name / tag
      • image size and push numbers
      • upload and push dates
    • image creating commands history
  • it is possible to set multiple repositories and watch all registries in one place
  • show statistics pretty, draw curves of uploads number and image sizes for a tag with respects to dates
  • find a parent of an image, in case, the parent in the same repo (it is clickable!)
  • show tree-graph of parents for image
  • (new) enabled image deletion (registry --version >= 2.4.0)
  • (the newest) API compatibility checks
  • (killer feature) Bearer token auth support (secure and self-signed auth servers)

Image deletion

To enable image deletion you need to:

  1. Run your registry with the flag -e REGISTRY_STORAGE_DELETE_ENABLED=true
    docker run -d -p 5000:5000 --restart=always --name registry \
    -v ./auth:/auth \
    -e "REGISTRY_AUTH=htpasswd" \
    -e "REGISTRY_AUTH_HTPASSWD_REALM=Registry Realm" \
    -e REGISTRY_AUTH_HTPASSWD_PATH=/auth/htpasswd \
  2. Set up cron to run garbage collection
    10 * * * * docker exec registry bin/registry garbage-collect /etc/docker/registry/config.yml
  3. Also be aware, that there is a known issue in docker registry 2.5.1 in earlier. It means, that if you delete an image from a repository, you will not able to push the exactly same image in that repository. To fix it, you will need each time to perform rebuilding of image with --no-cache mode or restarting the registry docker restart registry.

See more:

Bearer token auth

What is it and how it works see docker documentation.
Bow was tested to work with cesanta/docker_auth in this configuration.


I can say that this app almost fit my needs, so in all likelihood, soon, I will not improve it hardly, but this is the list of ideas just for case:

  • "update repos" button (not wait for sleep time)
  • info for the whole repository: size, the number of pushes so on so on so on

How to start use Bow

docker run -d \
   --name=Bow \
   -e BS_LOG_SILENT=yes \
   -v ~/db/bow:/var/lib/bow \
   -p 5001:19808 \

How to start contribute to Bow

If you have interest, you can easily start with

git clone
git clone project/resources/treant-js
cd bow
docker-compose -f develop/devlinux.yml up -d
docker exec -it develop_golang_1 go get
docker exec -it develop_golang_1 go test -v qurl -repo=''
docker exec -it develop_golang_1 go run main.go

Code and packages

This app is written on golang with use of standard packages and: -- BoltDB -- to make cli shiny -- to develop on docker-machine -- to draw best graphs ever -- to draw parents graphs

Docker Pull Command
Source Repository

Comments (8)
a year ago

Yes, such feature has been realised from the very beginning, but garbage-collector didn't work at that time, so I kept it commented. Thank you, that mentioned it! =) Will check it soon and uncomment.

a year ago

Is it possible, or can you add a function, to delete an image from the repository?
It's a bit crappy, to go to command-line, delete the repository and then go to the container for the garbage-collection (especially, if there are more people working on the images and you are the only one with a command-line)

a year ago


When I disable my crets, then it works. But with https, I have to play with the servers common names, cause there are too many (from docker net, from localhost, from outside net,....). And all have to work!
It seems, that I have to place a multi-host cert for the machin^^

a year ago

Just check, this is 100% work =)


a year ago

Yeah =) I've got this case.
As far as they are both inside of containers, they are not for each other, even if they are on the same machine.
The best way is, of course, make --link for them, and then write in "Repo addr" field "registry:5000".
Other way is use your host machine gateway.
In that case, "Repo addr" field is "".

Also, you need to write your password again, if you are editing repo config, but not creating new one. This is my fault =)

To check with cli, than it is possible, you need to use, for example, "curl test:test@", 'couse v1 is far depricated.

a year ago

Yes, but I'm testing with official registry:latest and a very basic configuration. So it seems not possible to connect via http. (curl -X GET gives some control charachters. In my oppinion, there's no possibility to connect without SSL)

a year ago

Hi, there. Have you tried to choose "http" scheme instead of "https" (in the config page)?

a year ago

Hi, I'm looking for your killer feature, but I'm not able to connect to an insecure registry with your instructions.
What do I have to set / change / add, to connect to my registry???