From d4540e84448395429f5e71de13acec620dc71713 Mon Sep 17 00:00:00 2001 From: Joxit Date: Mon, 6 Jun 2016 21:32:33 +0200 Subject: [PATCH] [Readme & Dockerfile] Add Readme and dockerfile for docker-hub --- Dockerfile | 51 ++++++++++++++++++++++++++++++++++++++++ README.md | 62 +++++++++++++++++++++++++++++++++++++++++++++++++ screenshot.png | Bin 0 -> 26446 bytes 3 files changed, 113 insertions(+) create mode 100644 Dockerfile create mode 100644 README.md create mode 100644 screenshot.png diff --git a/Dockerfile b/Dockerfile new file mode 100644 index 0000000..e0a53b8 --- /dev/null +++ b/Dockerfile @@ -0,0 +1,51 @@ +# Copyright (C) 2016 Jones Magloire @Joxit +# +# This program is free software: you can redistribute it and/or modify +# it under the terms of the GNU Affero General Public License as published by +# the Free Software Foundation, either version 3 of the License, or +# (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU Affero General Public License for more details. +# +# You should have received a copy of the GNU Affero General Public License +# along with this program. If not, see . +FROM node:slim + +MAINTAINER Jones MAGLOIRE @Joxit + +WORKDIR /usr/src/app + +RUN npm install -g http-server && npm cache clean + +COPY package.json /usr/src/app + +RUN npm install \ + && find node_modules/ \ + -maxdepth 1 -mindepth 1 -type d \ + ! -name riot \ + ! -name material-design-icons \ + ! -name material-design-* \ + ! -name dialog-polyfill \ + -exec rm -rf {} \; \ + && find node_modules/material-design-* \ + -maxdepth 1 -mindepth 1 \ + ! -name package.json \ + ! -name iconfont \ + ! -name LICENSE \ + ! -name material* \ + ! -name dist \ + -exec rm -rf {} \; \ + && find node_modules/material-design-lite/dist/ -maxdepth 1 -mindepth 1 \ + ! -name "*.js*" \ + ! -name "*.css*" \ + -exec rm -rf {} \; \ + && npm cache clean + +COPY . /usr/src/app + +EXPOSE 8080 + +ENTRYPOINT http-server diff --git a/README.md b/README.md new file mode 100644 index 0000000..e4c1575 --- /dev/null +++ b/README.md @@ -0,0 +1,62 @@ +# Docker Registry UI + +## Overview +This project aims to provide a user interface for your private docker registry v2. +There is no default registry on this UI, you should add your own with the UI. +You can manage more than one registry server. +All registry will be stored in the [local storage](https://en.wikipedia.org/wiki/Web_storage#Local_and_session_storage) of your browser. + +This web user interface use [Riot](https://github.com/Riot/riot) the react-like user interface micro-library and [Material Design Lite](https://github.com/google/material-design-lite) components. + +![screenshot](https://raw.github.com/Joxit/docker-registry-ui/master/screenshot.png "Screenshot of Docker Registry UI") + +## Features + + * List all your repositories/images. + * List all tags for a repository/image + * Sort the tag list + * One interface for many registry + +## Getting Started +### Basic + +First you need node and npm in order to download dependencies. + +```sh +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 +```sh +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 : +```sh +git clone https://github.com/Joxit/docker-registry-ui.git +docker build -t joxit/docker-registry-ui docker-registry-ui +``` + +Or build with the url : + ```sh +docker build -t joxit/docker-registry-ui github.com/Joxit/docker-registry-ui +``` + +Or pull the image from [docker hub](https://hub.docker.com/r/joxit/docker-registry-ui/) : +```sh +docker pull joxit/docker-registry-ui +``` + +#### Run the docker +To run the docker and see the website on your 8080 port, try this : +```sh +docker run -d -p 8080:8080 joxit/docker-registry-ui +``` diff --git a/screenshot.png b/screenshot.png new file mode 100644 index 0000000000000000000000000000000000000000..92635e244da9b8442c361812360d3ec72c2d45aa GIT binary patch literal 26446 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 ZT$Ow@{-5jdT9uTnEmthfUb5lae*uyC`g{NY literal 0 HcmV?d00001