Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Activating Open Collective #205

Open
wants to merge 66 commits into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
66 commits
Select commit Hold shift + click to select a range
2fe27a2
Add apiVersion flag and ENV_DOCKER_REGISTRY_API_VERSION var
kwk Jul 23, 2015
9e07142
Fix #53 by going to bootstrap 3.3.4
kwk Jul 24, 2015
5e15c62
Enable Angular's HTML5 mode in Grunt
kwk Aug 31, 2015
d20042e
Revert "Add apiVersion flag and ENV_DOCKER_REGISTRY_API_VERSION var"
kwk Aug 31, 2015
e5d8b3d
Add woff, woff2, ttf, and jpg to auto-route files
kwk Aug 31, 2015
9a4ba3c
Don't forward to index.html on /v2/ and jpg
kwk Aug 31, 2015
3f988e7
Restructure code
kwk Aug 31, 2015
6db5b07
List repos in v2 registry with paging (#47 and #7)
kwk Sep 3, 2015
339c8a7
Updated README to reflect v2 branch details.
kwk Sep 3, 2015
ef70220
Show simple list of tags in v2 registry's repository
kwk Sep 3, 2015
d447896
Apache config should handle v2 rather than v2
kwk Sep 16, 2015
c199f3a
Change texts referring to v1 to v2 in develop/ folder
kwk Sep 17, 2015
179467b
Try to shrink size of docker image by writing more compact Dockerfile
kwk Sep 17, 2015
2010da2
Make default number of repositories per page configurable
kwk Sep 24, 2015
ef9db0d
Add imagelayers.io label
kwk Oct 21, 2015
3379eb0
Make `ENV_MODE_BROWSE_ONLY=true` for now
kwk Nov 17, 2015
18077ef
Make `ENV_MODE_BROWSE_ONLY=true` for now
kwk Nov 17, 2015
81325dc
Fix #24 redirect apache logs to docker stdout/stderr
kwk Nov 17, 2015
d6fcb56
Fix path to about view
kwk Nov 17, 2015
4fe173e
Fix listing of tags
kwk Nov 17, 2015
83669c9
Output Apache errors to stdout as well
kwk Nov 18, 2015
ad39f23
Example setup
kwk Nov 18, 2015
b4990f6
Fix README.md filename
kwk Nov 18, 2015
223cc8f
Fix path to example-setup/README.md
kwk Nov 18, 2015
bdbe5cb
Fix documentation in docker-compose.yml
kwk Nov 18, 2015
b75e348
Update README.md
kwk Nov 27, 2015
9a1d6e0
Add note about wiki being for v1 currently
kwk Nov 28, 2015
7a464f7
Fix minor errors in text of README.md
kwk Dec 1, 2015
5b29b55
Fix spelling
kwk Dec 1, 2015
0faadab
bump up registry from 2.1.0 to 2.2.0
kwk Dec 1, 2015
75a6220
Update year in license
kwk Dec 2, 2015
021f028
Update docker registry api url
jim3ma Dec 9, 2015
d87a599
Merge pull request #76 from majinjing3/v2
kwk Dec 9, 2015
4b5cefd
Changes necessary to get dev env to work out of the box.
LarsModig Jan 11, 2016
a528256
Merge pull request #83 from LarsModig/devenv-fix
kwk Jan 13, 2016
d9cd1c2
fix small typo
cristifalcas Jan 16, 2016
bc7a80b
Merge pull request #85 from cristifalcas/patch-1
kwk Jan 16, 2016
71bc873
Setting ProxyPreserveHost to its default value: Off
cmays20 Jan 18, 2016
ca5dd30
Merge pull request #87 from cubfan20/v2
kwk Jan 20, 2016
9ba9dbe
Added dev-dependency badge
kwk Jan 26, 2016
2bbdebb
Added code climate badge
kwk Jan 26, 2016
96f04ea
Updated devdependencies
kwk Jan 26, 2016
2ab1311
Bumped package.js version from 0.0.1 to 0.0.2
kwk Jan 26, 2016
347c611
Update year in LICENSE file
kwk Jan 26, 2016
a4f9c5f
downgrade grunt-contrib-connect to version 0.10.1 because of changes …
Feb 5, 2016
355eb23
updates the development installation instruction for using own registry
Feb 5, 2016
0ba5ae5
Added equal sign after --insecure-registry=
kwk Feb 16, 2016
12ad29f
Merge pull request #96 from bjoernHeneka/downgrade-grunt-contrib-connect
kwk Mar 4, 2016
f030b79
Merge pull request #99 from bjoernHeneka/readme-update
kwk Mar 4, 2016
f287a38
Create ISSUE_TEMPLATE.md
kwk Mar 11, 2016
d5dd87d
Add image details support with API v2 (#84)
Apr 11, 2016
3b22da7
package.json: Add tasks and hooks
msabramo Jul 12, 2016
aaf1535
develop/README.md: Fix link (#138)
msabramo Jul 19, 2016
ea2bcd5
Make "npm test" run Karma tests (#140)
msabramo Jul 19, 2016
868546e
Remove app/services/registry-host-services.js (#141)
msabramo Jul 19, 2016
e9941db
Gruntfile.js: Use DOCKER_REGISTRY_{HOST,PORT} (#142)
msabramo Jul 19, 2016
b8ff23d
Merge branch 'npm_run_server' of git://github.com/msabramo/docker-reg…
kwk Jul 19, 2016
3452535
Merge branch 'msabramo-npm_run_server' into v2
kwk Jul 19, 2016
361825c
We need bzip2 in container to extract PhantomJS
kwk Jul 19, 2016
48ae06e
Try to trigger tests with travis (#146)
kwk Jul 20, 2016
c34f619
delay tag item showing until its manifest received (#137)
xiaodot Jul 20, 2016
3ad864b
Handle images with no user properly (#147)
msabramo Aug 4, 2016
bed7564
Remove unused RepositoryController route (#149)
msabramo Dec 13, 2016
acd3f1f
fix: ECONFLICT Unable to find suitable version for angular (#162)
Filirom1 Jul 6, 2017
288973b
Added backers and sponsors on the README
monkeywithacupcake Mar 17, 2019
26a61d4
Added call to donate after npm install (optional)
monkeywithacupcake Mar 17, 2019
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
27 changes: 27 additions & 0 deletions .github/ISSUE_TEMPLATE.md
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
***Before you open an issue, you should search for similar issues.
Especially for issues that deal with starting the docker-registry-frontend we have seen a tremendous amount
of issues and most of the time a reference to the [example-setup](https://github.com/kwk/docker-registry-frontend/tree/v2/example-setup)
folder was enough for the issue reporter to solve the issue on her own.***

Please, make sure to provide all the information asked for below and then delete everything above **Expected behavior** including this line.

## Expected behavior

- [x] *Please describe what you tried to do and what you expect the software to act like.*

## Actual behavior

- [x] *Please describe what happened instead of the expected behavior.*

## Steps to reproduce the problem

- [x] *Please describe how a developer can reproduce the issue that you faced.
Make sure you include information how you configured or started the registry and the frontend.*

## Specifications

- [x] Which version of docker (`docker version`) are you running?
- [x] Which operating system do you use?
- [x] Which version of the docker-registry-frontend are you running?
* If you have the frontend running already you can find the version at the very bottom on every page.
* Otherwise you can provide the output of `docker images | grep "docker-registry-frontend"`.
7 changes: 3 additions & 4 deletions .travis.yml
Original file line number Diff line number Diff line change
@@ -1,6 +1,5 @@
language: node_js
node_js:
- '0.10'
before_script:
- 'npm install -g bower grunt-cli'
- 'bower install'
- '4.4.7'
script:
- npm run test-single-run
64 changes: 23 additions & 41 deletions Dockerfile
Original file line number Diff line number Diff line change
Expand Up @@ -26,33 +26,13 @@ RUN echo "force-unsafe-io" > /etc/dpkg/dpkg.cfg.d/02apt-speedup
# # we don't need and apt cache in a container
RUN echo "Acquire::http {No-Cache=True;};" > /etc/apt/apt.conf.d/no-cache

############################################################
# Install and configure webserver software
############################################################

RUN apt-get -y update && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y install \
apache2 \
libapache2-mod-auth-kerb \
libapache2-mod-proxy-html \
--no-install-recommends

RUN a2enmod proxy
RUN a2enmod proxy_http

############################################################
# This adds everything we need to the build root except those
# element that are matched by .dockerignore.
# We explicitly list every directory and file that is involved
# in the build process but. All config files (like nginx) are
# not listed to speed up the build process.
############################################################

# Create dirs
RUN mkdir -p $SOURCE_DIR/dist
RUN mkdir -p $SOURCE_DIR/app
RUN mkdir -p $SOURCE_DIR/test
RUN mkdir -p $SOURCE_DIR/dist \
$SOURCE_DIR/app \
$SOURCE_DIR/test \
$SOURCE_DIR/.git

# Add dirs
ADD app $SOURCE_DIR/app
Expand All @@ -71,41 +51,43 @@ ADD LICENSE $SOURCE_DIR/
ADD package.json $SOURCE_DIR/
ADD README.md $SOURCE_DIR/

# Add Git version information to it's own json file app-version.json
RUN mkdir -p $SOURCE_DIR/.git
# Add some git files for versioning
ADD .git/HEAD $SOURCE_DIR/.git/HEAD
ADD .git/refs $SOURCE_DIR/.git/refs
RUN cd $SOURCE_DIR && \
export GITREF=$(cat .git/HEAD | cut -d" " -f2) && \
export GITSHA1=$(cat .git/$GITREF) && \
echo "{\"git\": {\"sha1\": \"$GITSHA1\", \"ref\": \"$GITREF\"}}" > $WWW_DIR/app-version.json && \
cd $SOURCE_DIR && \
rm -rf $SOURCE_DIR/.git

############################################################
# This is written so compact, to reduce the size of the
# final container and its layers. We have to install build
# dependencies, build the app, deploy the app to the web
# root, remove the source code, and then uninstall the build
# dependencies. When packed into one RUN instruction, the
# resulting layer will hopefully only be comprised of the
# installed app artifacts.
# Install and configure webserver software
############################################################

RUN apt-get -y install \
RUN apt-get -y update && \
export DEBIAN_FRONTEND=noninteractive && \
apt-get -y install \
apache2 \
bzip2 \
libapache2-mod-auth-kerb \
libapache2-mod-proxy-html \
git \
nodejs \
nodejs-legacy \
npm \
--no-install-recommends && \
a2enmod proxy && \
a2enmod proxy_http && \
cd $SOURCE_DIR && \
export GITREF=$(cat .git/HEAD | cut -d" " -f2) && \
export GITSHA1=$(cat .git/$GITREF) && \
echo "{\"git\": {\"sha1\": \"$GITSHA1\", \"ref\": \"$GITREF\"}}" > $WWW_DIR/app-version.json && \
cd $SOURCE_DIR && \
rm -rf $SOURCE_DIR/.git && \
git config --global url."https://".insteadOf git:// && \
cd $SOURCE_DIR && \
npm install && \
node_modules/bower/bin/bower install --allow-root && \
node_modules/grunt-cli/bin/grunt build --allow-root && \
cp -rf $SOURCE_DIR/dist/* $WWW_DIR && \
rm -rf $SOURCE_DIR && \
apt-get -y --auto-remove purge git nodejs nodejs-legacy npm && \
apt-get -y --auto-remove purge git nodejs nodejs-legacy npm bzip2 && \
apt-get -y autoremove && \
apt-get -y clean && \
rm -rf /var/lib/apt/lists/*

Expand Down
29 changes: 17 additions & 12 deletions Gruntfile.js
Original file line number Diff line number Diff line change
Expand Up @@ -15,6 +15,9 @@ module.exports = function (grunt) {
// Time how long tasks take. Can help when optimizing build times
require('time-grunt')(grunt);

// See http://stackoverflow.com/questions/17080494/using-grunt-server-how-can-i-redirect-all-requests-to-root-url
var modRewrite = require('connect-modrewrite');

grunt.loadNpmTasks('grunt-connect-proxy');

// Configurable paths for the application
Expand All @@ -36,7 +39,7 @@ module.exports = function (grunt) {
tasks: ['wiredep']
},
js: {
files: ['<%= yeoman.app %>/scripts/{,*/}*.js'],
files: ['<%= yeoman.app %>/{,*/}*.js'],
tasks: ['newer:jshint:all'],
options: {
livereload: '<%= connect.options.livereload %>'
Expand Down Expand Up @@ -75,13 +78,13 @@ module.exports = function (grunt) {
},
proxies: [
{
context: '/v1',
host: 'path-to-your-registry',
port: 80,
context: '/v2',
host: process.env.DOCKER_REGISTRY_HOST,
port: process.env.DOCKER_REGISTRY_PORT,
https: false,
xforward: false,
headers: {
"x-custom-added-header": 'custom-value'
'x-custom-added-header': 'custom-value'
}
}
],
Expand All @@ -90,6 +93,11 @@ module.exports = function (grunt) {
open: true,
middleware: function(connect) {
var middlewares = [];

// enable Angular's HTML5 mode
// http://stackoverflow.com/questions/17080494/using-grunt-server-how-can-i-redirect-all-requests-to-root-url
middlewares.push(modRewrite(['!^/v2/|\\.html|\\.js|\\.svg|\\.css|\\.png|\\.woff2|\\.woff|\\.ttf|\\.jpg$ /index.html [L]']));

// Setup the proxy
middlewares.push(require('grunt-connect-proxy/lib/utils').proxyRequest);

Expand Down Expand Up @@ -193,7 +201,7 @@ module.exports = function (grunt) {
filerev: {
dist: {
src: [
'<%= yeoman.dist %>/scripts/{,*/}*.js',
'<%= yeoman.dist %>/{,*/}*.js',
'<%= yeoman.dist %>/styles/{,*/}*.css',
'<%= yeoman.dist %>/images/{,*/}*.{png,jpg,jpeg,gif,webp,svg}',
'<%= yeoman.dist %>/styles/fonts/*'
Expand Down Expand Up @@ -289,7 +297,7 @@ module.exports = function (grunt) {
files: [{
expand: true,
cwd: '<%= yeoman.dist %>',
src: ['*.html', 'views/{,*/}*.html', 'scripts/directives/{,*/}*.html'],
src: ['*.html', '{,*/}*.html'],
dest: '<%= yeoman.dist %>'
}]
}
Expand Down Expand Up @@ -327,8 +335,7 @@ module.exports = function (grunt) {
'*.{ico,png,txt}',
'.htaccess',
'*.html',
'views/{,*/}*.html',
'scripts/directives/{,*/}*.html',
'{,*/}*.html',
'images/{,*/}*.{webp}',
'fonts/*'
]
Expand Down Expand Up @@ -408,9 +415,7 @@ module.exports = function (grunt) {

grunt.registerTask('build', [
'clean:dist',
// Somehow wiredep seems to kick out bootstrap CSS See
// docker-registry-frontend issue #53
//'wiredep',
'wiredep',
'useminPrepare',
'concurrent:dist',
'autoprefixer',
Expand Down
2 changes: 1 addition & 1 deletion LICENSE
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
The MIT License (MIT)

Copyright (c) 2014 Konrad Kleine
Copyright (c) 2014-2016 Konrad Kleine

Permission is hereby granted, free of charge, to any person obtaining a copy
of this software and associated documentation files (the "Software"), to deal
Expand Down
79 changes: 71 additions & 8 deletions README.md
Original file line number Diff line number Diff line change
@@ -1,10 +1,28 @@
# About

The `docker-registry-frontend` is a pure web-based solution for browsing and modifying a private Docker registry.
The `docker-registry-frontend` is a browser-based solution for browsing and modifying a private Docker registry.

[![](https://badge.imagelayers.io/konradkleine/docker-registry-frontend:v2.svg)](https://imagelayers.io/?images=konradkleine/docker-registry-frontend:v2 'Get your own badge on imagelayers.io')
[![devDependency Status](https://david-dm.org/kwk/docker-registry-frontend/dev-status.svg?style=flat-square)](https://david-dm.org/kwk/docker-registry-frontend#info=devDependencies)
[![Issue Count](https://codeclimate.com/github/kwk/docker-registry-frontend/badges/issue_count.svg)](https://codeclimate.com/github/kwk/docker-registry-frontend)
[![Backers on Open Collective](https://opencollective.com/docker-registry-frontend/backers/badge.svg?style=flat-square)](#backers)
[![Sponsors on Open Collective](https://opencollective.com/docker-registry-frontend/sponsors/badge.svg?style=flat-square)](#sponsors)

# Before opening a bug report...

...make sure you have consulted the `example-setup/README.md`.

## PLEASE, READ THIS!

***THIS VERSION OF THE DOCKER REGISTRY FRONTEND ONLY WORKS WITH THE DOCKER REGISTRY V2. THERE'S ALSO A LEGACY ["V1-DEPRECATED" BRANCH][v1branch] WHICH WORKS WITH THE OLD 0.9.1 DOCKER REGISTRY. THE ["V1-DEPRECATED" BRANCH][v1branch] IS VERY STABLE BUT WON'T RECEIVE SIGNIFICANT ATTENTION ANY LONGER BECAUSE THE OLD DOCKER REGISTRY WAS DECLARED DEPRECATED.***

***THE V2 SUPPORT FOR THE DOCKER REGISTRY FRONTEND IS STILL UNDER ACTIVE DEVELOPMENT. THERE'S A FAIR CHANCE THAT A MAJORITY OF FEATURES IS NOT YET IMPLEMENTED. CHECK THE [ISSUES](https://github.com/kwk/docker-registry-frontend/issues) AND OPEN A BUG IF SOMETHING DOESN'T WORK RIGHT AWAY.***

***TO PULL A VERSION OF THIS BRANCH FROM THE DOCKER HUB, MAKE SURE YOU PULL AND RUN ```konradkleine/docker-registry-frontend:v2```***

# Features

For a list of all the features, please see the [Wiki][features].
For a list of all the features, please see the [Wiki][features]. Note, that currently the Wiki pages still refer to version 1 of this frontend.

# Development

Expand All @@ -20,7 +38,7 @@ This application is available in the form of a Docker image that you can run as
-e ENV_DOCKER_REGISTRY_HOST=ENTER-YOUR-REGISTRY-HOST-HERE \
-e ENV_DOCKER_REGISTRY_PORT=ENTER-PORT-TO-YOUR-REGISTRY-HOST-HERE \
-p 8080:80 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

This command starts the container and forwards the container's private port `80` to your host's port `8080`. Make sure you specify the correct url to your registry.

Expand All @@ -36,7 +54,7 @@ If the Docker registry is only reachable via HTTPs (e.g. if it sits behind a pro
-e ENV_DOCKER_REGISTRY_PORT=ENTER-PORT-TO-YOUR-REGISTRY-HOST-HERE \
-e ENV_DOCKER_REGISTRY_USE_SSL=1 \
-p 8080:80 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

## SSL encryption

Expand All @@ -50,7 +68,7 @@ If you want to run the application with SSL enabled, you can do the following:
-v $PWD/server.crt:/etc/apache2/server.crt:ro \
-v $PWD/server.key:/etc/apache2/server.key:ro \
-p 443:443 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

Note that the application still serves the port `80` but it is simply not exposed ;). Enable it at your own will. When the application runs with SSL you can open your browser and navigate to [https://localhost][2].

Expand All @@ -74,7 +92,7 @@ We can override what hostname and port to put here:
-v $PWD/server.crt:/etc/apache2/server.crt:ro \
-v $PWD/server.key:/etc/apache2/server.key:ro \
-p 443:443 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

A value of `80` or `443` for `ENV_REGISTRY_PROXY_PORT` will not actually be shown as Docker will check `443` and then `80` by default.

Expand All @@ -94,7 +112,7 @@ do the following:
-e ENV_AUTH_KRB_REALMS="ENTER.YOUR.REALMS.HERE" \
-e ENV_AUTH_KRB_SERVICE_NAME=HTTP \
-p 80:80 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

You can of course combine SSL and Kerberos.

Expand All @@ -108,10 +126,24 @@ If you want to start applicaton with browse mode which means no repos/tags manag
-e ENV_DOCKER_REGISTRY_PORT=ENTER-PORT-TO-YOUR-REGISTRY-HOST-HERE \
-e ENV_MODE_BROWSE_ONLY=true \
-p 8080:80 \
konradkleine/docker-registry-frontend
konradkleine/docker-registry-frontend:v2

You can set `true` or `false` to this flag.

**NOTE** For now `ENV_MODE_BROWSE_ONLY` will be overwritten to `true`.

# Default repositories per page

By default 20 repositories will be listed per page. To adjust this number, to
let's say 50 pass `-e ENV_DEFAULT_REPOSITORIES_PER_PAGE=50` to your `docker run`
command.

# Default tags per page

By default 10 tags will be listed per page. To adjust this number, to
let's say 5 pass `-e ENV_DEFAULT_TAGS_PER_PAGE=5` to your `docker run`
command. Note that providing a big number will result in a heavy load on browsers.

# Contributions are welcome!

If you like the application, I invite you to contribute and report bugs or feature request on the project's github page: [https://github.com/kwk/docker-registry-frontend][3].
Expand All @@ -126,3 +158,34 @@ Thank you for your interest!
[2]: https://localhost
[3]: https://github.com/kwk/docker-registry-frontend
[features]: https://github.com/kwk/docker-registry-frontend/wiki/Features
[v1branch]: https://github.com/kwk/docker-registry-frontend/tree/v1-deprecated

## Contributors

This project exists thanks to all the people who contribute.
<a href="https://github.com/kwk/docker-registry-frontend/graphs/contributors"><img src="https://opencollective.com/docker-registry-frontend/contributors.svg?width=890&button=false" /></a>


## Backers

Thank you to all our backers! 🙏 [[Become a backer](https://opencollective.com/docker-registry-frontend#backer)]

<a href="https://opencollective.com/docker-registry-frontend#backers" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/backers.svg?width=890"></a>


## Sponsors

Support this project by becoming a sponsor. Your logo will show up here with a link to your website. [[Become a sponsor](https://opencollective.com/docker-registry-frontend#sponsor)]

<a href="https://opencollective.com/docker-registry-frontend/sponsor/0/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/0/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/1/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/1/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/2/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/2/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/3/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/3/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/4/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/4/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/5/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/5/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/6/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/6/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/7/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/7/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/8/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/8/avatar.svg"></a>
<a href="https://opencollective.com/docker-registry-frontend/sponsor/9/website" target="_blank"><img src="https://opencollective.com/docker-registry-frontend/sponsor/9/avatar.svg"></a>


Loading