mirror of
https://github.com/veggiemonk/awesome-docker.git
synced 2025-04-20 16:08:03 +02:00
Merge branch 'master' into master
This commit is contained in:
commit
41390852e1
39 changed files with 756994 additions and 455 deletions
1
.gitignore
vendored
1
.gitignore
vendored
|
@ -5,7 +5,6 @@ build
|
|||
node_modules
|
||||
.cache
|
||||
dist
|
||||
package-lock.json
|
||||
website/index.html
|
||||
website/table.html
|
||||
|
||||
|
|
1
.npmrc
Normal file
1
.npmrc
Normal file
|
@ -0,0 +1 @@
|
|||
save-exact=true
|
2
.nvmrc
2
.nvmrc
|
@ -1 +1 @@
|
|||
v8.10.0
|
||||
v8.11.3
|
||||
|
|
25
.travis.yml
25
.travis.yml
|
@ -1,7 +1,24 @@
|
|||
language: ruby
|
||||
rvm:
|
||||
- 2.2
|
||||
# This is a weird way of telling Travis to use the fast container-based test
|
||||
# runner instead of the slow VM-based runner.
|
||||
sudo: false
|
||||
|
||||
language: node_js
|
||||
|
||||
# Only clone the most recent commit.
|
||||
git:
|
||||
depth: 1
|
||||
|
||||
# keep cache of the deps
|
||||
cache:
|
||||
directories:
|
||||
- "node_modules"
|
||||
|
||||
before_install:
|
||||
- rvm install 2.2
|
||||
|
||||
before_script:
|
||||
- gem install awesome_bot
|
||||
|
||||
script:
|
||||
- awesome_bot README.md --white-list wiki/Installing,slideshare,awesome-docker.svg,edit/master,sindresorhus/awesome,ashmckenzie,shortcircuit.net.au,photo777.org,adrianmouat,redhat,viget,meros,toedter,datadoghq,amazon.cn,blog.codeship.com,swarm-v-fleet,amazon.com,blogs.splunk.com,docs.mesosphere.com,containership.io,gliderlabs.com,twistlock.com,shipyard-project.com,dashboard.tutum.co,vimeo.com,docs.microsoft.com,eclipse.org,codenvy.io,gitter.im,sebgoa.blogspot.be,mindmeister.com,events.docker,blog.sixeyed
|
||||
- awesome_bot README.md --white-list edit/master,sindresorhus/awesome,www.udacity.com,screwdriver.cd,veggiemonk/awesome-docker,vimeo.com
|
||||
- TOKEN=$GITHUB_TOKEN node buildMetadata.js && ./push.sh
|
||||
|
|
124
README.md
124
README.md
|
@ -13,7 +13,7 @@ If this list is not complete, you can [contribute][editREADME] to make it so. He
|
|||
|
||||
> **Please**, help organize these resources so that they are _easy to find_ and _understand_ for new comers. See how to **[Contribute][CONTRIBUTING]** for tips!
|
||||
|
||||
#### *If you see a link here that is not (any longer) a good fit, you can fix it by submitting a [pull request][editREADME] to improve this file. Thank you!*
|
||||
***If you see a link here that is not (any longer) a good fit, you can fix it by submitting a [pull request][editREADME] to improve this file. Thank you!***
|
||||
|
||||
The creators and maintainers of this list do not receive any form of payment to accept a change made by any contributor. This page is not an official Docker product in any way. It is a list of links to projects and is maintained by volunteers. Everybody is welcome to contribute. The goal of this repo is to index open-source projects, not to advertise for profit.
|
||||
|
||||
|
@ -84,17 +84,17 @@ All the links are monitored and tested with [awesome_bot](https://github.com/dkh
|
|||
|
||||
> Docker is an open platform for developers and sysadmins to build, ship, and run distributed applications. Consisting of Docker Engine, a portable, lightweight runtime and packaging tool, and Docker Hub, a cloud service for sharing applications and automating workflows, Docker enables apps to be quickly assembled from components and eliminates the friction between development, QA, and production environments. As a result, IT can ship faster and run the same app, unchanged, on laptops, data center VMs, and any cloud.
|
||||
|
||||
_Source:_ [What is Docker](https://www.docker.com/what-docker)
|
||||
_Source:_ [What is Docker](https://www.docker.com/why-docker)
|
||||
|
||||
# Where to start
|
||||
|
||||
- [Basics – Docker, Containers, Hypervisors, CoreOS](https://etherealmind.com/basics-docker-containers-hypervisors-coreos/)
|
||||
- [Dive Into Docker: From "What is Docker?" to "Hello World"](https://www.youtube.com/watch?v=XeSD17YRijk&list=PL-v3vdeWVEsXT-u0JDQZnM90feU3NE3v8) (60:25) by [@nickjanetakis][nickjanetakis]
|
||||
- [Dive Into Docker: From "What is Docker?" to "Hello World"](https://www.youtube.com/watch?v=XeSD17YRijk&list=PL-v3vdeWVEsXT-u0JDQZnM90feU3NE3v8) (60:25) by [@nickjanetakis](https://github.com/nickjj)
|
||||
- [Docker Curriculum](https://docker-curriculum.com): A comprehensive tutorial for getting started with Docker. Teaches how to use Docker and deploy dockerized apps on AWS with Elastic Beanstalk and Elastic Container Service.
|
||||
- [Docker Documentation](https://docs.docker.com/)
|
||||
- [Docker for all - Developers, Testers, DevOps, Product Owners + Videos](https://github.com/machzqcq/docker-for-all) Docker Training Videos for all
|
||||
- [Docker Jumpstart](https://github.com/odewahn/docker-jumpstart/): a quick introduction
|
||||
- [Docker Toolbox](https://docs.docker.com/toolbox/overview/) :skull: - Quick setup and launch of a Docker environment on older Mac (10.10 and below) and Windows (8.1 and below) systems. On newer systems it's recommended to use the [Docker for Mac][docker-for-mac] or [Docker for Windows][docker-for-windows].
|
||||
- [Docker Toolbox](https://docs.docker.com/toolbox/overview/) :skull: - Quick setup and launch of a Docker environment on older Mac (10.10 and below) and Windows (8.1 and below) systems. On newer systems it's recommended to use the [Docker for Mac](https://docs.docker.com/docker-for-mac/) or [Docker for Windows][docker-for-windows].
|
||||
- [Docker Training](https://training.docker.com/) - Includes a free self-paced hands-on tutorial (free registration required or sign-in with DockerHub ID)
|
||||
- [Katacoda](https://www.katacoda.com/): Learn Docker using Interactive Browser-Based Labs
|
||||
- [Learn Docker](https://github.com/dwyl/learn-docker) Full environment set up, screenshots, step-by-step tutorial and more resources (video, articles, cheat sheets) by [@dwyl](https://github.com/dwyl)
|
||||
|
@ -105,9 +105,9 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
**Cheatsheets** by
|
||||
|
||||
- [@eon01](https://github.com/eon01/DockerCheatSheet)
|
||||
- [@dimonomid][docker-quick-ref] (PDF)
|
||||
- [@dimonomid](https://github.com/dimonomid/docker-quick-ref) (PDF)
|
||||
- [@JensPiegsa](http://docker.jens-piegsa.com)
|
||||
- [@wsargent][docker-cheat-sheet]
|
||||
- [@wsargent](https://github.com/wsargent/docker-cheat-sheet)
|
||||
|
||||
# Where to start (Windows)
|
||||
|
||||
|
@ -152,12 +152,12 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
- [docker-compose-graphviz](https://github.com/abesto/docker-compose-graphviz) - Turn a docker-compose.yml files into Graphviz .dot files by [@abesto](https://github.com/abesto)
|
||||
- [draw-compose](https://github.com/Alexis-benoist/draw-compose) - Utility to draw a schema of a docker compose by [@Alexis-benoist](https://github.com/Alexis-benoist)
|
||||
- [elsy](https://github.com/cisco/elsy) - An opinionated, multi-language, build tool based on Docker and Docker Compose
|
||||
- [habitus](https://github.com/cloud66/habitus) - A Build Flow Tool for Docker by [@cloud66](https://github.com/cloud66)
|
||||
- [habitus](https://github.com/cloud66-oss/habitus) - A Build Flow Tool for Docker by [@cloud66](https://github.com/cloud66)
|
||||
- [Maestro](https://github.com/toscanini/maestro) :skull: - Maestro provides the ability to easily launch, orchestrate and manage mulitiple Docker containers as single unit by [@tascanini](https://github.com/toscanini)
|
||||
- [percheron][percheron] :skull: - Organise your Docker containers with muscle and intelligence by [@ashmckenzie](https://github.com/ashmckenzie)
|
||||
- [percheron](https://github.com/ashmckenzie/percheron) :skull: - Organise your Docker containers with muscle and intelligence by [@ashmckenzie](https://github.com/ashmckenzie)
|
||||
- [plash](https://github.com/ihucos/plash) - A container run and build engine - runs inside docker.
|
||||
- [rocker-compose](https://github.com/grammarly/rocker-compose) - Docker composition tool with idempotency features for deploying apps composed of multiple containers. By [@grammarly](grammarly)
|
||||
- [rocker](https://github.com/grammarly/rocker) - Extended Dockerfile builder. Supports multiple FROMs, MOUNTS, templates, etc. by [grammarly](grammarly).
|
||||
- [rocker](https://github.com/grammarly/rocker) - Extended Dockerfile builder. Supports multiple FROMs, MOUNTS, templates, etc. by [grammarly](https://github.com/grammarly).
|
||||
- [Stacker](https://github.com/stacker/stacker-cli) - Docker Compose Templates. Stacker provides an abstraction layer over Docker Compose and a better DX (developer experience).
|
||||
- [Zodiac](https://github.com/CenturyLinkLabs/zodiac) :skull: - A lightweight tool for easy deployment and rollback of dockerized applications. By [@CenturyLinkLabs][CenturyLinkLabs]
|
||||
|
||||
|
@ -165,13 +165,13 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
|
||||
- [blackfish](https://gitlab.com/blackfish/blackfish) - a CoreOS VM to build swarm clusters for Dev & Production by [@DataMC](http://datamc.io/)
|
||||
- [Centurion](https://github.com/newrelic/centurion) - Centurion is a mass deployment tool for Docker fleets. It takes containers from a Docker registry and runs them on a fleet of hosts with the correct environment variables, host volume mappings, and port mappings. By [@newrelic](https://github.com/newrelic)
|
||||
- [Clocker](https://github.com/brooklyncentral/clocker) - Clocker creates and manages a Docker cloud infrastructure. Clocker supports single-click deployments and runtime management of multi-node applications that run as containers distributed across multiple hosts, on both Docker and Marathon. It leverages [Calico][calico] and [Weave][weave] for networking and [Brooklyn][brooklyn] for application blueprints. By [@brooklyncentral](https://github.com/brooklyncentral)
|
||||
- [Clocker](https://github.com/brooklyncentral/clocker) - Clocker creates and manages a Docker cloud infrastructure. Clocker supports single-click deployments and runtime management of multi-node applications that run as containers distributed across multiple hosts, on both Docker and Marathon. It leverages [Calico][calico] and [Weave][weave] for networking and [Brooklyn](http://brooklyn.apache.org/) for application blueprints. By [@brooklyncentral](https://github.com/brooklyncentral)
|
||||
- [Conduit](https://github.com/ehazlett/conduit) - Experimental deployment system for Docker by [@ehazlett](https://github.com/ehazlett)
|
||||
- [depcon](https://github.com/ContainX/depcon) - Depcon is written in Go and allows you to easily deploy Docker containers to Apache Mesos/Marathon, Amazon ECS and Kubernetes. By [@ContainX][ContainX]
|
||||
- [deploy](https://github.com/ttiny/deploy) :skull: - Git and Docker deployment tool. A middle ground between simple Docker composition tools and full blown cluster orchestration by [@ttiny](https://github.com/ttiny)
|
||||
- [dockit](https://github.com/humblec/dockit) :skull: - Do docker actions and Deploy gluster containers! By [@humblec](https://github.com/humblec)
|
||||
- [gitkube](https://github.com/hasura/gitkube) - Gitkube is a tool for building and deploying docker images on Kubernetes using `git push`. By [@Hasura](https://github.com/hasura/).
|
||||
- [Grafeas](https://github.com/Grafeas/Grafeas) - A common API for metadata about containers, from image and build details to security vulnerabilities. By [Grafeas](https://github.com/Grafeas)
|
||||
- [Grafeas](https://github.com/grafeas/grafeas) - A common API for metadata about containers, from image and build details to security vulnerabilities. By [grafeas](https://github.com/grafeas)
|
||||
- [Longshoreman](https://github.com/longshoreman/longshoreman) :skull: - Longshoreman automates application deployment using Docker. Just create a Docker repository (or use a service), configure the cluster using AWS or Digital Ocean (or whatever you like) and deploy applications using a Heroku-like CLI tool. By [longshoreman](https://github.com/longshoreman)
|
||||
|
||||
### Monitoring
|
||||
|
@ -180,14 +180,13 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
- [cAdvisor](https://github.com/google/cadvisor) - Analyzes resource usage and performance characteristics of running containers. Created by [@Google][google]
|
||||
- [Docker-Alertd](https://github.com/deltaskelta/docker-alertd) - Monitor and send alerts based on docker container resource usage/statistics
|
||||
- [Docker-Flow-Monitor](https://github.com/docker-flow/docker-flow-monitor) - Reconfigures Prometheus when a new service is updated or deployed automatically by [@vfarcic][vfarcic]
|
||||
- [Docker-Fluentd][fluentd] - Docker container to Log Other Containers' Logs. One can aggregate the logs of Docker containers running on the same host using Fluentd by [@kiyoto][kiyoto]
|
||||
- [Docker-Fluentd](https://github.com/kiyoto/docker-fluentd) - Docker container to Log Other Containers' Logs. One can aggregate the logs of Docker containers running on the same host using Fluentd by [@kiyoto](https://github.com/kiyoto)
|
||||
- [Dockerana](https://github.com/dockerana/dockerana) :skull: - packaged version of Graphite and Grafana, specifically targeted at metrics from Docker.
|
||||
- [Dynatrace](https://www.dynatrace.com/technologies/cloud-and-microservices/docker-monitoring/) :heavy_dollar_sign: - Monitor containerized applications without installing agents or modifying your Run commands
|
||||
- [Glances](https://github.com/nicolargo/glances) - A cross-platform curses-based system monitoring tool written in Python by [@nicolargo](https://github.com/nicolargo)
|
||||
- [Grafana Docker Dashboard Template](https://grafana.com/dashboards/179) - A template for your Docker, Grafana and Prometheus stack [@vegasbrianc][vegasbrianc]
|
||||
- [InfluxDB, cAdvisor, Grafana](https://github.com/vegasbrianc/docker-monitoring) - InfluxDB Time series DB in combination with Grafana and cAdvisor by [@vegasbrianc][vegasbrianc]
|
||||
- [LogJam](https://github.com/gocardless/logjam) - Logjam is a log forwarder designed to listen on a local port, receive log entries over UDP, and forward these messages on to a log collection server (such as logstash) by [@gocardless](https://github.com/gocardless)
|
||||
- [Logsene for Docker][spm] Monitoring of Metrics, Events and Logs implemented in Node.js. Integrated [logagent-js](https://github.com/sematext/logagent-js) to detect and parse various log formats. [@sematext][sematext]
|
||||
- [Logspout](https://github.com/gliderlabs/logspout) - Log routing for Docker container logs by [@gliderlabs][gliderlabs]
|
||||
- [NexClipper](https://github.com/NexClipper/NexClipper) - NexClipper is the container monitoring and performance management solution specialized in Docker, Apache Mesos, Marathon, DC/OS, Mesosphere, Kubernetes by [@Nexclipper](https://github.com/NexClipper)
|
||||
- [Out-of-the-box Host/Container Monitoring/Logging/Alerting Stack](https://github.com/uschtwill/docker_monitoring_logging_alerting) - Docker host and container monitoring, logging and alerting out of the box using cAdvisor, Prometheus, Grafana for monitoring, Elasticsearch, Kibana and Logstash for logging and elastalert and Alertmanager for alerting. Set up in 5 Minutes. Secure mode for production use with built-in [Automated Nginx Reverse Proxy (jwilder's)][nginxproxy].
|
||||
|
@ -221,7 +220,7 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
- [Mesos](https://github.com/apache/mesos) - Resource/Job scheduler for containers, VM's and physical hosts [@apache](https://mesos.apache.org/)
|
||||
- [Mesosphere DC/OS](https://mesosphere.com/product/) :heavy_dollar_sign: - Integrated platform for data and containers built on Apache Mesos by [@mesosphere](https://mesosphere.com)
|
||||
- [Nebula](https://github.com/nebula-orchestrator) - A Docker orchestration tool designed to manage massive scale distributed clusters.
|
||||
- [Nomad](https://github.com/hashicorp/nomad) - Easily deploy applications at any scale. A Distributed, Highly Available, Datacenter-Aware Scheduler by [@hashicorp][hashicorp]
|
||||
- [Nomad](https://github.com/hashicorp/nomad) - Easily deploy applications at any scale. A Distributed, Highly Available, Datacenter-Aware Scheduler by [@hashicorp](https://github.com/hashicorp)
|
||||
- [Panamax](https://github.com/CenturyLinkLabs/panamax-ui) :skull: - An open-source project that makes deploying complex containerized apps as easy as Drag-and-Drop by [@CenturyLinkLabs][CenturyLinkLabs].
|
||||
- [Rancher](https://github.com/rancher/rancher) - An open source project that provides a complete platform for operating Docker in production by [@rancher][rancher].
|
||||
- [Swarmpit](https://github.com/swarmpit/swarmpit) - Lightweight Docker Swarm orchestration. Swarmpit provides clean way to manage your Docker Swarm cluster with various handful features such Service management, smart search, shared access and private registries.
|
||||
|
@ -232,12 +231,12 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
- [CaptainDuckDuck](https://github.com/githubsaturn/captainduckduck) - Open source Heroku-like platform with a one-liner installer and a GUI for managing apps - with serveral one-click databases and apps.
|
||||
- [Convox Rack](https://github.com/convox/rack) - Convox Rack is open source PaaS built on top of expert infrastructure automation and devops best practices.
|
||||
- [Dcw](https://github.com/pbertera/dcw) - Docker-compose SSH wrapper: a very poor man PaaS, exposing the docker-compose and custom-container commands defined in container labels.
|
||||
- [Dokku][dokku] - Docker powered mini-Heroku that helps you build and manage the lifecycle of applications (originally by [@progrium][progrium])
|
||||
- [Dokku](https://github.com/dokku/dokku) - Docker powered mini-Heroku that helps you build and manage the lifecycle of applications (originally by [@progrium][progrium])
|
||||
- [Empire](https://github.com/remind101/empire) - A PaaS built on top of Amazon EC2 Container Service (ECS)
|
||||
- [Flynn](https://github.com/flynn/flynn) - A next generation open source platform as a service
|
||||
- [Jelastic](https://jelastic.com/) :heavy_dollar_sign: - An advanced PaaS for developers that simplifies clustering and complex cloud deployments with powerful web UI and usage-only pricing
|
||||
- [Nanobox](https://github.com/nanobox-io/nanobox) :heavy_dollar_sign: - An application development platform that creates local environments that can then be deployed and scaled in the cloud.
|
||||
- [OpenShift][openshift] - An open source PaaS built on [Kubernetes][kubernetes] and optimized for Dockerized app development and deployment by [Red Hat](https://www.redhat.com/)
|
||||
- [OpenShift][openshift] - An open source PaaS built on [Kubernetes][kubernetes] and optimized for Dockerized app development and deployment by [Red Hat](https://www.redhat.com/en)
|
||||
- [Tsuru](https://github.com/tsuru/tsuru) - Tsuru is an extensible and open source Platform as a Service software
|
||||
- [Workflow](https://github.com/deis/workflow) - The open source PaaS for Kubernetes by [Deis](https://github.com/deis). Formerly Deis v1.
|
||||
- [ZEIT Now](https://github.com/zeit/now-cli) - A universal serverless single-command deploy for Node.js applications or any application with a Dockerfile.
|
||||
|
@ -267,14 +266,14 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
- [docker-bench-security](https://github.com/docker/docker-bench-security) - script that checks for dozens of common best-practices around deploying Docker containers in production. By [@docker][docker]
|
||||
- [docker-explorer](https://github.com/google/docker-explorer) - A tool to help forensicate offline docker acquisitions by [@Google][google]
|
||||
- [notary](https://github.com/theupdateframework/notary) - a server and a client for running and interacting with trusted collections. By [@TUF](https://github.com/theupdateframework)
|
||||
- [oscap-docker](https://github.com/OpenSCAP/openscap) - OpenSCAP provides oscap-docker tool which is used to scan Docker containers and images. By RedHat
|
||||
- [oscap-docker](https://github.com/OpenSCAP/openscap) - OpenSCAP provides oscap-docker tool which is used to scan Docker containers and images. By [OpenSCAP](https://github.com/OpenSCAP)
|
||||
- [Sysdig Falco](https://github.com/draios/falco) - Sysdig Falco is an open source container security monitor. It can monitor application, container, host, and network activity and alert on unauthorized activity.
|
||||
- [Sysdig Secure](https://sysdig.com/product/secure/) :heavy_dollar_sign: - Sysdig Secure addresses run-time security through behavioral monitoring and defense, and provides deep forensics based on open source Sysdig for incident response.
|
||||
- [Twistlock](https://www.twistlock.com/) :heavy_dollar_sign: - Twistlock Security Suite detects vulnerabilities, hardens container images, and enforces security policies across the lifecycle of applications.
|
||||
|
||||
### Service Discovery
|
||||
|
||||
- [Docker Grand Ambassador](https://github.com/cpuguy83/docker-grand-ambassador) :skull: - This is a fully dynamic docker link ambassador. + [Article](https://docs.docker.com/engine/admin/ambassador_pattern_linking/) by [@cpuguy83][cpuguy83]
|
||||
- [Docker Grand Ambassador](https://github.com/cpuguy83/docker-grand-ambassador) :skull: - This is a fully dynamic docker link ambassador. + [Article](https://docs.docker.com/engine/admin/ambassador_pattern_linking/) by [@cpuguy83](https://github.com/cpuguy83)
|
||||
- [docker-consul](https://github.com/gliderlabs/docker-consul) by [@progrium][progrium]
|
||||
- [etcd](https://github.com/coreos/etcd) - A highly-available key value store for shared configuration and service discovery by [@coreOS][coreos]
|
||||
- [istio](https://github.com/istio/istio) - An open platform to connect, manage, and secure microservices by [@IstioMesh](istio)
|
||||
|
@ -283,7 +282,7 @@ _Source:_ [What is Docker](https://www.docker.com/what-docker)
|
|||
|
||||
### Volume Management / Data
|
||||
|
||||
- [Blockbridge](https://github.com/blockbridge/blockbridge-docker-volume) - The Blockbridge plugin is a volume plugin that provides access to an extensible set of container-based persistent storage options. It supports single and multi-host Docker environments with features that include tenant isolation, automated provisioning, encryption, secure deletion, snapshots and QoS. By [@blockbridge][blockbridge]
|
||||
- [Blockbridge](https://github.com/blockbridge/blockbridge-docker-volume) - The Blockbridge plugin is a volume plugin that provides access to an extensible set of container-based persistent storage options. It supports single and multi-host Docker environments with features that include tenant isolation, automated provisioning, encryption, secure deletion, snapshots and QoS. By [@blockbridge](https://github.com/blockbridge)
|
||||
- [Convoy](https://github.com/rancher/convoy) - an open-source Docker volume driver that can snapshot, backup and restore Docker volumes anywhere. By [@rancher][rancher]
|
||||
- [Docker Machine NFS](https://github.com/adlogix/docker-machine-nfs) Activates NFS for an existing boot2docker box created through Docker Machine on OS X.
|
||||
- [Docker Unison](https://github.com/leighmcculloch/docker-unison) A docker volume container using Unison for fast two-way folder sync. Created as an alternative to slow boot2docker volumes on OS X. By [@leighmcculloch](https://github.com/leighmcculloch)
|
||||
|
@ -316,7 +315,7 @@ Native desktop applications for managing and montoring docker hosts and clusters
|
|||
- [docker.el](https://github.com/Silex/docker.el) Manage docker from Emacs by [Silex](https://github.com/Silex)
|
||||
- [dockercraft](https://github.com/docker/dockercraft) - Docker + Minecraft = Dockercraft by [@docker][docker]
|
||||
- [dockerfile-mode](https://github.com/spotify/dockerfile-mode) An emacs mode for handling Dockerfiles by [spotify][spotify]
|
||||
- [dockersql](https://github.com/crosbymichael/dockersql) - A command line interface to query Docker using SQL by [@crosbymichael][crosbymichael]
|
||||
- [dockersql](https://github.com/crosbymichael/dockersql) - A command line interface to query Docker using SQL by [@crosbymichael](https://github.com/crosbymichael)
|
||||
- [dockly](https://github.com/lirantal/dockly) - An interactive shell UI for managing Docker containers by [@lirantal](https://github.com/lirantal)
|
||||
- [dry](https://github.com/moncho/dry) - An interactive CLI for Docker containers by [@moncho](https://github.com/moncho)
|
||||
- [DVM](https://github.com/howtowhale/dvm) - Docker version manager by [@howtowhale](https://github.com/howtowhale)
|
||||
|
@ -339,7 +338,6 @@ Native desktop applications for managing and montoring docker hosts and clusters
|
|||
- [docker-swarm-visualizer](https://github.com/dockersamples/docker-swarm-visualizer) - Visualizes Docker services on a Docker Swarm (for running demos).
|
||||
- [dockering-on-rails](https://github.com/Electrofenster/dockerding-on-rails) :skull: - Simple Web-Interface for Docker with a lot of features by [@Electrofenster](https://github.com/Electrofenster/)
|
||||
- [DockerSurfer](https://github.com/Simone-Erba/DockerSurfer) :construction: - A web service for analyze and browse dependencies between Docker images in the Docker registry, by [@Simone-Erba](https://github.com/Simone-Erba/)
|
||||
- [NexClipper](https://github.com/NexClipper/NexClipper) - Simple web UI for container monitoring by [@Nexclipper](https://github.com/NexClipper)
|
||||
- [OctoLinker](https://github.com/OctoLinker/OctoLinker) - A browser extension for GitHub that makes the image name in a `Dockerfile` clickable and redirect you to the related Docker Hub page.
|
||||
- [Portainer](https://github.com/portainer/portainer) - A lightweight management UI for managing your Docker hosts or Docker Swarm clusters by [@portainer](https://github.com/portainer)
|
||||
- [Portus](https://github.com/SUSE/Portus) - Authorization service and frontend for Docker registry (v2) by [@SUSE](https://github.com/SUSE)
|
||||
|
@ -354,10 +352,10 @@ Native desktop applications for managing and montoring docker hosts and clusters
|
|||
Tools and applications that are either installed inside containers or designed to be run as a [sidecar](https://docs.microsoft.com/en-us/azure/architecture/patterns/sidecar)
|
||||
|
||||
- [amicontained](https://github.com/genuinetools/amicontained) - Container introspection tool. Find out what container runtime is being used as well as features available by [@genuinetools][genuinetools]
|
||||
- [autodock](https://github.com/prologic/autodock) - Daemon for Docker Automation by [@prologic][prologic]
|
||||
- [autodock](https://github.com/prologic/autodock) - Daemon for Docker Automation by [@prologic](https://github.com/prologic)
|
||||
- [Chaperone](https://github.com/garywiz/chaperone) - A single PID1 process designed for docker containers. Does user management, log management, startup, zombie reaping, all in one small package. by [@garywiz](https://github.com/garywiz)
|
||||
- [CoreOS][coreos] - Linux for Massive Server Deployments
|
||||
- [docker-alpine][alpine] - A super small Docker base image *(5MB)* using Alpine Linux by [@gliderlabs][gliderlabs]
|
||||
- [docker-alpine](https://github.com/gliderlabs/docker-alpine) - A super small Docker base image *(5MB)* using Alpine Linux by [@gliderlabs][gliderlabs]
|
||||
- [docker-gen](https://github.com/jwilder/docker-gen) - Generate files from docker container meta-data by [@jwilder][jwilder]
|
||||
- [dockerize](https://github.com/jwilder/dockerize) - Utility to simplify running applications in docker containers by [@jwilder][jwilder]
|
||||
- [GoSu](https://github.com/tianon/gosu) - Run this specific application as this specific user and get out of the pipeline (entrypoint script tool) by [@tianon](https://github.com/tianon)
|
||||
|
@ -379,6 +377,7 @@ Applications designed to help or simplify building **new** images
|
|||
- [Derrick](https://github.com/alibaba/derrick) - A tool help you to automate the generation of Dockerfile and dockerize application by scanning the code. By [@alibaba](https://github.com/alibaba).
|
||||
- [dlayer](https://github.com/wercker/dlayer) - Stats collector for Docker layers by [@wercker](https://github.com/wercker)
|
||||
- [docker-companion](https://github.com/mudler/docker-companion) - A command line tool written in Golang to squash and unpack docker images by [@mudler](https://github.com/mudler/)
|
||||
- [DockerMake](https://github.com/avirshup/DockerMake) - A reproducible Docker image build system for complex software stacks. By [@avirshup](https://github.com/avirshup)
|
||||
- [docker-make](https://github.com/CtripCloud/docker-make) - Build, tag,and push a bunch of related docker images via a single command.
|
||||
- [docker-replay](https://github.com/bcicen/docker-replay) - Generate `docker run`command and options from running containers. By [bcicen](https://github.com/bcicen)
|
||||
- [DockerSlim](https://github.com/docker-slim/docker-slim) shrinks fat Docker images creating the smallest possible images.
|
||||
|
@ -387,11 +386,12 @@ Applications designed to help or simplify building **new** images
|
|||
- [flyimg](http://flyimg.io/) - Docker image resizing, cropping, and compression on the fly.
|
||||
- [img](https://github.com/genuinetools/img) - Standalone, daemon-less, unprivileged Dockerfile and OCI compatible container image builder by [@genuinetools][genuinetools]
|
||||
- [kaniko](https://github.com/GoogleContainerTools/kaniko) - Build Container Images In Kubernetes. By [@GoogleContainerTools][GoogleContainerTools]
|
||||
- [MicroBadger][microbadger] - Analyze the contents of images and add metadata labels
|
||||
- [MicroBadger](https://microbadger.com) - Analyze the contents of images and add metadata labels
|
||||
- [packer](https://www.packer.io/docs/builders/docker.html) - Hashicorp tool to build machine images including docker image integrated with configuration management tools like chef, puppet, ansible
|
||||
- [portainer](https://github.com/duedil-ltd/portainer) - Apache Mesos framework for building Docker images by [@duedil-ltd](https://github.com/duedil-ltd)
|
||||
- [runlike](https://github.com/lavie/runlike) 🚧 - Generate `docker run`command and options from running containers by [@lavie](https://github.com/lavie)
|
||||
- [runlike](https://github.com/lavie/runlike) - Generate `docker run`command and options from running containers by [@lavie](https://github.com/lavie)
|
||||
- [SkinnyWhale](https://github.com/djosephsen/skinnywhale) :skull: - Skinnywhale helps you make smaller (as in megabytes) Docker containers.
|
||||
- [Smith](https://github.com/oracle/smith) - A Micocontainer Builder and can perform multi-stage builds after the image is built [Oracle][oracle]
|
||||
- [Whaler](https://github.com/P3GLEG/Whaler) - Program to reverse Docker images into Dockerfiles by [@P3GLEG](https://github.com/P3GLEG/).
|
||||
- [Whales](https://github.com/Gueils/whales) - A tool to automatically dockerize your applications by [@icalialabs](https://github.com/IcaliaLabs).
|
||||
|
||||
|
@ -407,7 +407,7 @@ Examples by:
|
|||
- [@arun-gupta](https://github.com/arun-gupta/docker-images)
|
||||
- [@awesome-startup](https://github.com/awesome-startup/docker-compose)
|
||||
- [@crosbymichael](https://github.com/crosbymichael/Dockerfiles)
|
||||
- [@jessfraz](https://github.com/jessfraz/Dockerfiles)
|
||||
- [@jessfraz](https://github.com/jessfraz/dockerfiles)
|
||||
- [@komljen](https://github.com/komljen/dockerfile-examples)
|
||||
- [@kstaken](https://github.com/kstaken/dockerfile-examples)
|
||||
- [@ondrejmo](https://github.com/ondrejmo/Dockerfiles)
|
||||
|
@ -444,10 +444,10 @@ Services to securely store your Docker images.
|
|||
- [JFrog Artifactory :heavy_dollar_sign:](https://jfrog.com/artifactory/) - Artifact Repository Manager, can be used as private Docker Registry as well
|
||||
- [Private Docker Registry :heavy_dollar_sign:](https://private-docker-registry.com) - Dedicated Conainer Registry Service with unlimited private repositories, users, teams, namespaces together with enterprise grade authentication LDAP/AD/OAuth/SAML.
|
||||
- [Quay.io :heavy_dollar_sign:](https://quay.io/) (part of CoreOS) - Secure hosting for private Docker repositories
|
||||
- [Rescoyl](https://github.com/noteed/rescoyl) - Private Docker registry (free and open source) by [@noteed][noteed]
|
||||
- [Rescoyl](https://github.com/noteed/rescoyl) - Private Docker registry (free and open source) by [@noteed](https://github.com/noteed)
|
||||
- [Sonatype Nexus](https://www.sonatype.com/nexus-repository-oss) - Repository with Universal Support, also for Docker images
|
||||
- [TreeScale](https://github.com/treescale) - Build and Distribute container based applications. By [@tigranbs](https://github.com/tigranbs)
|
||||
- [VMWare Harbor](http://vmware.github.io/harbor/) Project Harbor by VMWare is an enterprise-class registry server that stores and distributes Docker images. Harbor extends the open source Docker Distribution by adding the functionalities usually required by an enterprise, such as security, identity and management.
|
||||
- [VMWare Harbor](https://github.com/goharbor/harbor) Project Harbor by VMWare is an enterprise-class registry server that stores and distributes Docker images. Harbor extends the open source Docker Distribution by adding the functionalities usually required by an enterprise, such as security, identity and management.
|
||||
|
||||
## Development with Docker
|
||||
|
||||
|
@ -476,7 +476,7 @@ Services to securely store your Docker images.
|
|||
- [Cyclone](https://github.com/caicloud/cyclone) - A cloud native CI/CD platform built for container workflow by [@caicloud](https://github.com/caicloud).
|
||||
- [Docker plugin for Jenkins](https://github.com/jenkinsci/docker-plugin/) - The aim of the docker plugin is to be able to use a docker host to dynamically provision a slave, run a single build, then tear-down that slave.
|
||||
- [Drone](https://github.com/drone/drone) - Continuous integration server built on Docker and configured using YAML files.
|
||||
- [GitLab CI](https://about.gitlab.com/gitlab-ci/) - GitLab has integrated CI to test, build and deploy your code with the use of GitLab runners.
|
||||
- [GitLab Runner](https://gitlab.com/gitlab-org/gitlab-runner) - GitLab has integrated CI to test, build and deploy your code with the use of GitLab runners.
|
||||
- [GOCD-Docker](https://github.com/gocd/gocd-docker)Go Server and Agent in docker containers to provision.
|
||||
- [Microservices Continuous Deployment](https://github.com/francescou/docker-continuous-deployment) - Continuous deployment of a microservices application.
|
||||
- [mu](https://github.com/stelligent/mu) - Tool to configure CI/CD of your container applications via AWS CodePipeline, CodeBuild and ECS [@Stelligent](https://github.com/stelligent)
|
||||
|
@ -490,13 +490,14 @@ Services to securely store your Docker images.
|
|||
- [Binci](https://github.com/binci/binci) - Containerize your development workflow. (formerly DevLab by [@TechnologyAdvice](https://github.com/TechnologyAdvice))
|
||||
- [Boot2Docker](https://github.com/boot2docker/boot2docker) - Docker for OSX and Windows
|
||||
- [construi](https://github.com/lstephen/construi) - Run your builds inside a Docker defined environment by [@lstephen](https://github.com/lstephen)
|
||||
- [Crashcart](https://github.com/oracle/crashcart) - Sideload Linux binaries into a running container for troubleshooting by [@Oracle][oracle]
|
||||
- [Devstep](https://github.com/fgrehm/devstep) :skull: - Development environments powered by Docker and buildpacks by [@fgrehm][fgrehm]
|
||||
- [Dinghy](https://github.com/codekitchen/dinghy) - An alternative way to use Docker on Mac OS X using Docker Machine with virtualbox, vmware, xhyve or parallels
|
||||
- [DLite](https://github.com/nlf/dlite) - Simplest way to use Docker on OSX, no VM needed. By [@nlf](https://github.com/nlf)
|
||||
- [dobi](https://github.com/dnephin/dobi) - A build automation tool for Docker applications. By [@dnephin](https://github.com/dnephin)
|
||||
- [Docker Missing Tools](https://github.com/nandoquintana/docker-missing-tools) - A set of bash commands to shortcut typical docker dev-ops. An alternative to creating typical helper scripts like "build.sh" and "deploy.sh" inside code repositories. By [@NandoQuintana](https://github.com/nandoquintana).
|
||||
- [Docker osx dev](https://github.com/brikis98/docker-osx-dev) - A productive development environment with Docker on OS X by [@brikis98](https://github.com/brikis98)
|
||||
- [Docker-Arch](https://github.com/ph3nol/docker-arch) - Generate Web/CLI projects Dockerized development environments, from 1 simple YAML file. By [@Ph3nol](https://github.com/ph3nol)
|
||||
- [Docker-Arch](https://github.com/Ph3nol/Docker-Arch) - Generate Web/CLI projects Dockerized development environments, from 1 simple YAML file. By [@Ph3nol](https://github.com/ph3nol)
|
||||
- [Docker-sync](http://docker-sync.io/) - Drastically improves performance ([50-70x](https://github.com/EugenMayer/docker-sync/wiki/4.-Performance)) when using Docker for development on Mac OS X/Windows and Linux while sharing code to the container. By [@EugenMayer](https://github.com/EugenMayer)
|
||||
- [docker-vm](https://github.com/shyiko/docker-vm) - Simple and transparent alternative to boot2docker (backed by Vagrant) by [@shyiko](https://github.com/shyiko)
|
||||
- [Dusty](http://dusty.gc.com/) - Managed Docker development environments on OS X
|
||||
|
@ -509,7 +510,7 @@ Services to securely store your Docker images.
|
|||
### Garbage Collection
|
||||
|
||||
- [caduc](https://github.com/tjamet/caduc) - A docker garbage collector cleaning stuff you did not use recently
|
||||
- [Docker Clean](https://github.com/zzrotdesign/docker-clean) - A script that cleans Docker containers, images and volumes by [@zzrotdesign](https://github.com/zzrotdesign)
|
||||
- [Docker Clean](https://github.com/ZZROTDesign/docker-clean) - A script that cleans Docker containers, images and volumes by [@zzrotdesign](https://github.com/ZZROTDesign)
|
||||
- [Docker-cleanup](https://github.com/meltwater/docker-cleanup) - Automatic Docker image, container and volume cleanup by [@meltwater](https://github.com/meltwater)
|
||||
- [docker-custodian](https://github.com/Yelp/docker-custodian) - Keep docker hosts tidy. By [@Yelp](https://github.com/Yelp)
|
||||
- [docker-garby](https://github.com/konstruktoid/docker-garby) - Docker garbage collection script by [@konstruktoid](https://github.com/konstruktoid).
|
||||
|
@ -518,7 +519,7 @@ Services to securely store your Docker images.
|
|||
|
||||
### Serverless
|
||||
|
||||
- [AMP](https://github.com/appcelerator/amp) - The open source unified CaaS/FaaS platform for Docker, batteries included. By [@Appcelerator](https://github.com/appcelerator/)
|
||||
- [AMP](https://github.com/appcelerator-archive/amp) - The open source unified CaaS/FaaS platform for Docker, batteries included. By [@Appcelerator](https://github.com/appcelerator-archive)
|
||||
- [Apache OpenWhisk](https://github.com/apache/incubator-openwhisk) - a serverless, open source cloud platform that executes functions in response to events at any scale. By [@apache](https://github.com/apache)
|
||||
- [Docker-Lambda](https://github.com/lambci/docker-lambda) - Docker images and test runners that replicate the live AWS Lambda environment. By [@lamb-ci](https://github.com/lambci)
|
||||
- [Funker](https://github.com/bfirsh/funker-example-voting-app) - Functions as Docker containers example voting app. By [@bfirsh](https://github.com/bfirsh)
|
||||
|
@ -545,7 +546,7 @@ Services to securely store your Docker images.
|
|||
- [Dray](https://github.com/CenturyLinkLabs/dray) - An engine for managing the execution of container-based workflows by [@CenturyLinkLabs][CenturyLinkLabs]
|
||||
- [FuGu](https://github.com/mattes/fugu) - Docker run wrapper without orchestration by [@mattes](https://github.com/mattes)
|
||||
- [SaltStack Docker module](https://docs.saltstack.com/en/latest/ref/modules/all/salt.modules.dockerng.html#module-salt.modules.dockerng) - SaltStack Docker module
|
||||
- [Shutit](http://ianmiell.github.io/shutit/) - Tool for building and maintaining complex Docker deployments by [@ianmiell][ianmiell]
|
||||
- [Shutit](https://github.com/ianmiell/shutit) - Tool for building and maintaining complex Docker deployments by [@ianmiell](https://github.com/ianmiell)
|
||||
- [subuser](https://github.com/subuser-security/subuser) - Makes it easy to securely and portably run graphical desktop applications in Docker
|
||||
- [Turbo](https://github.com/ramitsurana/turbo) - Simple and Powerful utility for docker. By [@ramitsurana][ramitsurana]
|
||||
- [udocker](https://github.com/indigo-dc/udocker) - A tool to execute simple docker containers in batch or interactive systems without root privileges by [@inidigo-dc](https://github.com/indigo-dc)
|
||||
|
@ -572,7 +573,7 @@ Services to securely store your Docker images.
|
|||
- [Azure AKS](https://azure.microsoft.com/en-us/services/kubernetes-service/) - Simplify Kubernetes management, deployment, and operations. Use a fully managed Kubernetes container orchestration service.
|
||||
- [Cloud 66](https://www.cloud66.com) - Full-stack hosted container management as a service
|
||||
- [Codenvy](https://codenvy.com) - One-click Docker environments and cloud workspace for development teams
|
||||
- [ContainerShip Cloud][containership] - Multi-Cloud Container Hosting Automation Platform.
|
||||
- [ContainerShip Cloud](https://containership.io) - Multi-Cloud Container Hosting Automation Platform.
|
||||
- [Docker Cloud](https://cloud.docker.com/) - Former Tutum
|
||||
- [Dockhero](https://dockhero.io/) - Dockhero is a Heroku add-on which turns a Docker image into a microservice attached to the Heroku app. Currently in beta.
|
||||
- [Giant Swarm](https://giantswarm.io/) - Simple microservice infrastructure. Deploy your containers in seconds.
|
||||
|
@ -592,10 +593,9 @@ Services to securely store your Docker images.
|
|||
- [Collecting docker logs and stats with Splunk](https://www.splunk.com/blog/2015/08/24/collecting-docker-logs-and-stats-with-splunk.html)
|
||||
- [CoScale](https://www.coscale.com/docker-monitoring) - Full stack monitoring for containerized applications and microservices. Powered by anomaly detection to find performance problems faster.
|
||||
- [Datadog](https://www.datadoghq.com/) - Datadog is a full-stack monitoring service for large-scale cloud environments that aggregates metrics/events from servers, databases, and applications. It includes support for Docker, Kubernetes, and Mesos.
|
||||
- [Meros](https://meros.io) - Analyzes containers resources, captures logs, remote web SSH terminal and powerful DevOps alerts.
|
||||
- [Prometheus](https://prometheus.io/) - Open-source service monitoring system and time series database
|
||||
- [Site24x7](https://www.site24x7.com/docker-monitoring.html) - Docker Monitoring for DevOps and IT is a SaaS Pay per Host model
|
||||
- [SPM for Docker][spm] - Monitoring of host and container metrics, Docker events and logs. Automatic log parser. Anomaly Detection and alerting for metrics and logs. [@sematext][sematext]
|
||||
- [SPM for Docker](https://github.com/sematext/sematext-agent-docker) - Monitoring of host and container metrics, Docker events and logs. Automatic log parser. Anomaly Detection and alerting for metrics and logs. [@sematext](https://github.com/sematext)
|
||||
- [Sysdig Monitor](https://sysdig.com/product/monitor/) - Sysdig Monitor can be used as either software or a SaaS service to monitor, alert, and troubleshoot containers using system calls. It has container-specific features for Docker and Kubernetes.
|
||||
|
||||
# Useful Resources
|
||||
|
@ -615,7 +615,7 @@ Blogs by
|
|||
- [@jwilder](http://jasonwilder.com/)
|
||||
- [@nickjanetakis](https://nickjanetakis.com/blog/tag/docker-tips-tricks-and-tutorials)
|
||||
- [@progrium](http://progrium.com/blog/)
|
||||
- [@sebgoa](http://sebgoa.blogspot.be/)
|
||||
- [@sebgoa](http://sebgoa.blogspot.com/)
|
||||
- [Container solutions](https://container-solutions.com/blog/)
|
||||
- [Container42](https://container42.com/)
|
||||
|
||||
|
@ -632,7 +632,7 @@ Blogs by
|
|||
|
||||
- [Dealing with linked containers dependency in docker-compose](http://brunorocha.org/python/dealing-with-linked-containers-dependency-in-docker-compose.html) by [@rochacbruno](https://github.com/rochacbruno)
|
||||
- [Docker Caveats](http://docker-saigon.github.io/post/Docker-Caveats/) What You Should Know About Running Docker In Production (written 11 APRIL 2016) __MUST SEE__
|
||||
- [Docker Containers on the Desktop][jessblog] - The **funniest way** to learn about docker by [@jessfraz][jessfraz] who also gave a [presentation][jessvid] about it @ DockerCon 2015
|
||||
- [Docker Containers on the Desktop](https://blog.jessfraz.com/post/docker-containers-on-the-desktop/) - The **funniest way** to learn about docker by [@jessfraz][jessfraz] who also gave a [presentation](https://www.youtube.com/watch?v=1qlLUf7KtAw) about it @ DockerCon 2015
|
||||
- [Docker vs. VMs? Combining Both for Cloud Portability Nirvana](https://www.rightscale.com/blog/cloud-management-best-practices/docker-vs-vms-combining-both-cloud-portability-nirvana)
|
||||
- [Don't Repeat Yourself with Anchors, Aliases and Extensions in Docker Compose Files](https://medium.com/@kinghuang/docker-compose-anchors-aliases-extensions-a1e4105d70bd) by [@King Chung Huang](https://github.com/kinghuang)
|
||||
- [GUI Apps with Docker](http://fabiorehm.com/blog/2014/09/11/running-gui-apps-with-docker/) by [@fgrehm][fgrehm]
|
||||
|
@ -642,7 +642,7 @@ Blogs by
|
|||
- [Docker Pirates ARMed with explosive stuff](http://blog.hypriot.com/) Huge resource on clustering, swarm, docker, pre-installed image for SD card on Raspberry Pi
|
||||
- [Get Docker up and running on the RaspberryPi in three steps](https://github.com/umiddelb/armhf/wiki/Get-Docker-up-and-running-on-the-RaspberryPi-%28ARMv6%29-in-three-steps)
|
||||
- [git push docker containers to linux devices](https://resin.io/) Modern DevOps for IoT, leveraging git and Docker.
|
||||
- [Installing, running, using Docker on armhf (ARMv7) devices](https://github.com/umiddelb/armhf/wiki/Installing,-running,-using-docker-on-armhf-(ARMv7)-devices)
|
||||
- [Installing, running, using Docker on armhf (ARMv7) devices](https://github.com/umiddelb/armhf/wiki/Installing,-running,-using-docker-on-armhf-%28ARMv7%29-devices)
|
||||
|
||||
## Security
|
||||
|
||||
|
@ -666,14 +666,14 @@ Blogs by
|
|||
- [Contributing to Docker by Andrew "Tianon" Page (InfoSiftr)](https://www.youtube.com/watch?v=1jwo8-1HYYg) (34:31)
|
||||
- [Deploying and scaling applications with Docker, Swarm, and a tiny bit of Python magic](https://www.youtube.com/watch?v=GpHMTR7P2Ms) (3:11:06) by [@jpetazzo][jpetazzo]
|
||||
- [Docker and SELinux by Daniel Walsh from Red Hat](https://www.youtube.com/watch?v=zWGFqMuEHdw) (40:23)
|
||||
- [Docker for Developers][docker4dev] (54:26) by [@jpetazzo][jpetazzo] <== Good introduction, context, demo
|
||||
- [Docker for Developers](https://www.youtube.com/watch?v=FdkNAjjO5yQ) (54:26) by [@jpetazzo][jpetazzo] <== Good introduction, context, demo
|
||||
- [Docker in Production](https://www.youtube.com/watch?v=Glk5d5WP6MI) by [@jpetazzo][jpetazzo] (36:05)
|
||||
- [Docker: How to Use Your Own Private Registry](https://www.youtube.com/watch?v=CAewZCBT4PI) (15:01)
|
||||
- [Extending Docker with Plugins](https://vimeo.com/110835013) (15:21)
|
||||
- [From Local Docker Development to Production Deployments](https://www.youtube.com/watch?v=7CZFpHUPqXw) by [@jpetazzo][jpetazzo] @ AWS re:Invent 2015
|
||||
- [Immutable Infrastructure with Docker and EC2 by Michael Bryzek (Gilt)](https://www.youtube.com/watch?v=GaHzdqFithc) (42:04)
|
||||
- [Introduction to Docker and containers](https://www.youtube.com/watch?v=ZVaRK10HBjo) (3:09:00) by [@jpetazzo][jpetazzo]
|
||||
- [Logging on Docker: What You Need to Know][loggingDocker] (51:27)
|
||||
- [Logging on Docker: What You Need to Know](https://vimeo.com/123341629) (51:27)
|
||||
- [Performance Analysis of Docker - Jeremy Eder](https://www.youtube.com/watch?v=6f2E6PKYb0w) (1:36:58)
|
||||
- [Scalable Microservices with Kubernetes](https://www.udacity.com/course/scalable-microservices-with-kubernetes--ud615) Free Udacity course
|
||||
- [State of containers: a debate with CoreOS, VMware and Google](https://www.youtube.com/watch?v=IiITP3yIRd8) (27:38)
|
||||
|
@ -701,74 +701,36 @@ Blogs by
|
|||
|
||||
- [Docker Russian-speaking Community](https://t.me/docker_ru)
|
||||
|
||||
[ahmetalpbalkan]: https://github.com/ahmetalpbalkan
|
||||
[alpine]: https://github.com/gliderlabs/docker-alpine
|
||||
[anchore]: https://github.com/anchore
|
||||
[arun-gupta]: https://github.com/arun-gupta
|
||||
[blockbridge]: https://github.com/blockbridge
|
||||
[brooklyn]: http://brooklyn.apache.org/
|
||||
[CONTRIBUTING]: https://github.com/veggiemonk/awesome-docker/blob/master/.github/CONTRIBUTING.md
|
||||
[calico]: https://github.com/projectcalico/calicoctl
|
||||
[CenturyLinkLabs]: https://github.com/CenturyLinkLabs
|
||||
[containership]: https://containership.io
|
||||
[ContainX]: https://github.com/ContainX
|
||||
[coreos]: https://github.com/coreos
|
||||
[cpuguy83]: https://github.com/cpuguy83
|
||||
[crosbymichael]: https://github.com/crosbymichael
|
||||
[dimonomid]: https://github.com/dimonomid
|
||||
[distribution]: https://github.com/docker/distribution
|
||||
[docker-cheat-sheet]: https://github.com/wsargent/docker-cheat-sheet
|
||||
[docker-compose]: https://docs.docker.com/compose/
|
||||
[docker-for-mac]: https://docs.docker.com/docker-for-mac/
|
||||
[docker-for-windows]: https://docs.docker.com/docker-for-windows/
|
||||
[docker-quick-ref]: https://github.com/dimonomid/docker-quick-ref
|
||||
[docker]: https://github.com/docker
|
||||
[docker4dev]: https://www.youtube.com/watch?v=FdkNAjjO5yQ
|
||||
[dokku]: https://github.com/dokku/dokku
|
||||
[editREADME]: https://github.com/veggiemonk/awesome-docker/edit/master/README.md
|
||||
[fgrehm]: https://github.com/fgrehm
|
||||
[fluentd]: https://github.com/kiyoto/docker-fluentd
|
||||
[gesellix]: https://github.com/gesellix
|
||||
[genuinetools]: https://github.com/genuinetools
|
||||
[gliderlabs]: https://github.com/gliderlabs
|
||||
[google]: https://github.com/google
|
||||
[GoogleContainerTools]: https://github.com/GoogleContainerTools
|
||||
[grammarly]: https://github.com/grammarly
|
||||
[hashicorp]: https://github.com/hashicorp
|
||||
[ianmiell]: https://github.com/ianmiell
|
||||
[inspec]: https://github.com/inspec/inspec
|
||||
[JensPiegsa]: https://github.com/JensPiegsa
|
||||
[jessblog]: https://blog.jessfraz.com/post/docker-containers-on-the-desktop/
|
||||
[jessfraz]: https://github.com/jessfraz
|
||||
[jessfrazdockerfiles]: https://github.com/jessfraz/dockerfiles
|
||||
[jessfrazdotfiles]: https://github.com/jessfraz/dotfiles
|
||||
[jessvid]: https://www.youtube.com/watch?v=1qlLUf7KtAw
|
||||
[jpetazzo]: https://github.com/jpetazzo
|
||||
[jwilder]: https://github.com/jwilder
|
||||
[kartar]: https://twitter.com/kartar
|
||||
[kiyoto]: https://github.com/kiyoto
|
||||
[kubernetes]: https://kubernetes.io
|
||||
[loggingDocker]: https://vimeo.com/123341629
|
||||
[microbadger]: https://microbadger.com
|
||||
[nginxproxy]: https://github.com/jwilder/nginx-proxy
|
||||
[nickjanetakis]: https://twitter.com/nickjanetakis
|
||||
[noteed]: https://github.com/noteed
|
||||
[ondrejmo]: https://github.com/ondrejmo
|
||||
[openshift]: https://www.openshift.org/
|
||||
[pandrew]: https://github.com/pandrew
|
||||
[percheron]: https://github.com/ashmckenzie/percheron
|
||||
[openshift]: https://www.okd.io
|
||||
[oracle]: https://github.com/oracle
|
||||
[progrium]: https://github.com/progrium
|
||||
[projectatomic]: https://github.com/projectatomic
|
||||
[prologic]: https://github.com/prologic
|
||||
[ramitsurana]: https://github.com/ramitsurana
|
||||
[rancher]: https://github.com/rancher
|
||||
[sebgoa]: https://twitter.com/sebgoa
|
||||
[sematext]: https://twitter.com/sematext
|
||||
[sindresorhus]: https://github.com/sindresorhus/awesome
|
||||
[spm]: https://github.com/sematext/sematext-agent-docker
|
||||
[spotify]: https://github.com/spotify
|
||||
[vegasbrianc]: https://github.com/vegasbrianc
|
||||
[vfarcic]: https://github.com/vfarcic
|
||||
[vimagick]: https://github.com/vimagick
|
||||
[weave]: https://github.com/weaveworks/weave
|
||||
[wsargent]: https://github.com/wsargent
|
||||
|
|
311
build.js
311
build.js
|
@ -1,25 +1,233 @@
|
|||
const fs = require('fs');
|
||||
const showdown = require('showdown');
|
||||
const fs = require('fs-extra');
|
||||
const fetch = require('node-fetch');
|
||||
const cheerio = require('cheerio');
|
||||
const dayjs = require('dayjs');
|
||||
const showdown = require('showdown');
|
||||
const Parcel = require('parcel-bundler');
|
||||
const sm = require('sitemap');
|
||||
|
||||
process.env.NODE_ENV = 'production';
|
||||
|
||||
process.on('unhandledRejection', error => {
|
||||
console.log('unhandledRejection', error.message);
|
||||
});
|
||||
const LOG = {
|
||||
error: (...args) => console.error('❌ ERROR', { ...args }),
|
||||
debug: (...args) => {
|
||||
if (process.env.DEBUG) console.log('💡 DEBUG: ', { ...args });
|
||||
},
|
||||
};
|
||||
const handleFailure = err => {
|
||||
LOG.error(err);
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
const readme = 'README.md';
|
||||
const template = 'website/index.tmpl.html';
|
||||
const merged = 'website/index.html';
|
||||
const destination = 'website/index.html';
|
||||
process.on('unhandledRejection', handleFailure);
|
||||
|
||||
const includeReadme = ({
|
||||
md = readme,
|
||||
templateHTML = template,
|
||||
dest = merged,
|
||||
} = {}) => {
|
||||
// --- FILES
|
||||
const README = 'README.md';
|
||||
const WEBSITE_FOLDER = 'website';
|
||||
const DATA_FOLDER = 'data';
|
||||
const LATEST_FILENAME = `${DATA_FOLDER}/latest`;
|
||||
const MAPPING = `${DATA_FOLDER}/mapping.json`;
|
||||
const CATEGORY = `${DATA_FOLDER}/category.json`;
|
||||
const indexTemplate = `${WEBSITE_FOLDER}/index.tmpl.html`;
|
||||
const indexDestination = `${WEBSITE_FOLDER}/index.html`;
|
||||
const tableTemplate = `${WEBSITE_FOLDER}/table.tmpl.html`;
|
||||
const tableDestination = `${WEBSITE_FOLDER}/table.html`;
|
||||
|
||||
// --- CONFIG
|
||||
const valueNames = [
|
||||
'name',
|
||||
'description',
|
||||
'homepage',
|
||||
'star',
|
||||
'updated',
|
||||
'language',
|
||||
'license',
|
||||
'author',
|
||||
];
|
||||
|
||||
const sitemapOpts = {
|
||||
hostname: 'https://awesome-docker.netlify.com/',
|
||||
cacheTime: 6000000, // 600 sec (10 min) cache purge period
|
||||
urls: [
|
||||
{
|
||||
url: '/',
|
||||
changefreq: 'daily',
|
||||
priority: 0.8,
|
||||
lastmodrealtime: true,
|
||||
lastmodfile: 'dist/index.html',
|
||||
},
|
||||
{
|
||||
url: '/table.html',
|
||||
changefreq: 'daily',
|
||||
priority: 0.8,
|
||||
lastmodrealtime: true,
|
||||
lastmodfile: 'dist/table.html',
|
||||
},
|
||||
],
|
||||
};
|
||||
|
||||
// --- FORMAT
|
||||
const loadEmoji = () =>
|
||||
fetch('https://api.github.com/emojis')
|
||||
.then(r => r.json())
|
||||
.catch(handleFailure);
|
||||
|
||||
let emojiMapURL = {};
|
||||
|
||||
const emojify = text => {
|
||||
if (!text) return text;
|
||||
const colonWrapped = /(:[\w\-+]+:)/g;
|
||||
const result = text.replace(colonWrapped, match => {
|
||||
const name = match.replace(/:/g, '');
|
||||
const url = emojiMapURL[name];
|
||||
return url ? `<img src="${url}" class="emoji" alt="${name}" />` : match;
|
||||
});
|
||||
return result || text;
|
||||
};
|
||||
|
||||
const getLastUpdate = updated => {
|
||||
const updt = Number(dayjs(updated).diff(dayjs(), 'days'));
|
||||
if (updt < 0) {
|
||||
if (Math.abs(updt) === 1) return `1 day ago`;
|
||||
return `${Math.abs(updt)} days ago`;
|
||||
} else if (updt === 0) return 'today';
|
||||
return updated;
|
||||
};
|
||||
|
||||
const mapHomePage = h => {
|
||||
if (h === 'manageiq.org') return 'https://manageiq.org';
|
||||
else if (h === 'dev-sec.io') return 'https://dev-sec.io';
|
||||
return h;
|
||||
};
|
||||
|
||||
const mapLicense = l => {
|
||||
if (l === 'GNU Lesser General Public License v3.0') return 'GNU LGPL v3.0';
|
||||
else if (l === 'GNU General Public License v2.0') return 'GNU GPL v2.0';
|
||||
else if (l === 'GNU General Public License v3.0') return 'GNU GPL v3.0';
|
||||
else if (l === 'BSD 3-Clause "New" or "Revised" License')
|
||||
return 'BSD 3-Clause';
|
||||
else if (l === 'BSD 2-Clause "Simplified" License') return 'BSD 2-Clause';
|
||||
return l;
|
||||
};
|
||||
|
||||
const formatEntry = (
|
||||
{
|
||||
name,
|
||||
html_url: repoURL,
|
||||
description,
|
||||
homepage,
|
||||
stargazers_count: stargazers,
|
||||
pushed_at: updated,
|
||||
language,
|
||||
license,
|
||||
owner,
|
||||
categoryName,
|
||||
},
|
||||
i,
|
||||
) =>
|
||||
[
|
||||
`<li data-id="${i}">`,
|
||||
`<a href="${repoURL}" class="link ${valueNames[0]}">${name}</a>`,
|
||||
`<p class="${valueNames[1]}">${emojify(description) || '-'}</p>`,
|
||||
`<p class="${
|
||||
valueNames[4]
|
||||
} timestamp" data-timestamp="${updated}">Last code update: ${getLastUpdate(
|
||||
updated,
|
||||
)}</p>`,
|
||||
(homepage &&
|
||||
`<a href="${mapHomePage(homepage)}" class="link ${
|
||||
valueNames[2]
|
||||
}">website</a>`) ||
|
||||
'<p></p>',
|
||||
`<p class="${
|
||||
valueNames[3]
|
||||
} timestamp" title="Stars on GitHub" data-timestamp="${stargazers}">⭐️${stargazers}</p>`,
|
||||
(language && `<p class="${valueNames[5]}">${language}</p>`) || '<p></p>',
|
||||
(license &&
|
||||
license.url !== null &&
|
||||
`<a href="${license.url}" class="link ${valueNames[6]}">${mapLicense(
|
||||
license.name,
|
||||
)}</a>`) ||
|
||||
'<p></p>',
|
||||
`<p title="Category">${categoryName}</p>`,
|
||||
owner &&
|
||||
`<a href="${owner.html_url}" class="link ${valueNames[7]}">${
|
||||
owner.login
|
||||
}</a>`,
|
||||
'</li>',
|
||||
].join('');
|
||||
|
||||
const buttonHTLM = valueNames
|
||||
.filter(x => !['description', 'homepage'].includes(x))
|
||||
.map(v => `<button class="sort" data-sort="${v}">${v} </button>`)
|
||||
.join('');
|
||||
|
||||
const processMetadata = metaData =>
|
||||
[
|
||||
`<div class="container">`,
|
||||
`<div class="searchbar"><input class="search" placeholder="Search" /></div>`,
|
||||
`<div class="sortbtn"><p>Sort by</p>${buttonHTLM}</div>`,
|
||||
`</div>`,
|
||||
'<ul class="list">',
|
||||
Object.values(metaData)
|
||||
.map(formatEntry)
|
||||
.join(''),
|
||||
'</ul>',
|
||||
].join('');
|
||||
|
||||
const normalizedMetadata = ([mapping, category, data]) =>
|
||||
data.reduce((acc, repo) => {
|
||||
const m = mapping[repo.html_url];
|
||||
if (!m) {
|
||||
console.log('MISSING:', { repo: repo.html_url });
|
||||
return acc;
|
||||
}
|
||||
const c = m && category[m.category];
|
||||
if (!c) {
|
||||
console.log('CATEGORY MISSING', { mapping: m });
|
||||
return acc;
|
||||
}
|
||||
return {
|
||||
...acc,
|
||||
...{
|
||||
[repo.html_url.toLowerCase()]: {
|
||||
...repo,
|
||||
ownerType: repo.owner && repo.owner.type,
|
||||
categoryName: c.name,
|
||||
categoryDescription: c.description,
|
||||
status: m.status,
|
||||
},
|
||||
},
|
||||
};
|
||||
}, {});
|
||||
|
||||
async function processTable() {
|
||||
try {
|
||||
LOG.debug('Loading files...', { LATEST_FILENAME, tableTemplate });
|
||||
const latestFilename = await fs.readFile(LATEST_FILENAME, 'utf8');
|
||||
LOG.debug({ latestFilename });
|
||||
|
||||
const data = await Promise.all([
|
||||
fs.readJSON(MAPPING),
|
||||
fs.readJSON(CATEGORY),
|
||||
fs.readJSON(latestFilename),
|
||||
]);
|
||||
|
||||
const metaData = normalizedMetadata(data);
|
||||
LOG.debug({ metaData });
|
||||
const template = await fs.readFile(tableTemplate, 'utf8');
|
||||
LOG.debug('Processing template');
|
||||
const $ = cheerio.load(template);
|
||||
$('#md').append(processMetadata(metaData));
|
||||
LOG.debug('Writing table.html');
|
||||
await fs.outputFile(tableDestination, $.html(), 'utf8');
|
||||
LOG.debug('✅ DONE 👍');
|
||||
} catch (err) {
|
||||
handleFailure(err);
|
||||
}
|
||||
}
|
||||
|
||||
async function processIndex() {
|
||||
const converter = new showdown.Converter({
|
||||
omitExtraWLInCodeBlocks: true,
|
||||
simplifiedAutoLink: true,
|
||||
|
@ -41,58 +249,47 @@ const includeReadme = ({
|
|||
});
|
||||
// converter.setFlavor('github');
|
||||
|
||||
console.log('Loading files...');
|
||||
const indexTemplate = fs.readFileSync(templateHTML, 'utf8');
|
||||
const markdown = fs.readFileSync(md, 'utf8');
|
||||
try {
|
||||
LOG.debug('Loading files...', { indexTemplate, README });
|
||||
const template = await fs.readFile(indexTemplate, 'utf8');
|
||||
const markdown = await fs.readFile(README, 'utf8');
|
||||
|
||||
console.log('Merging files...');
|
||||
const $ = cheerio.load(indexTemplate);
|
||||
$('#md').append(converter.makeHtml(markdown));
|
||||
console.log('Writing index.html');
|
||||
fs.writeFileSync(dest, $.html(), 'utf8');
|
||||
console.log('DONE 👍');
|
||||
};
|
||||
LOG.debug('Merging files...');
|
||||
const $ = cheerio.load(template);
|
||||
$('#md').append(converter.makeHtml(markdown));
|
||||
|
||||
const bundle = (dest = destination) => {
|
||||
console.log('');
|
||||
console.log('Bundling with Parcel.js');
|
||||
console.log('');
|
||||
LOG.debug('Writing index.html');
|
||||
await fs.outputFile(indexDestination, $.html(), 'utf8');
|
||||
LOG.debug('DONE 👍');
|
||||
} catch (err) {
|
||||
handleFailure(err);
|
||||
}
|
||||
}
|
||||
|
||||
new Parcel(dest, {
|
||||
const bundle = () => {
|
||||
LOG.debug('---');
|
||||
LOG.debug('📦 Bundling with Parcel.js');
|
||||
LOG.debug('---');
|
||||
|
||||
new Parcel(indexDestination, {
|
||||
name: 'build',
|
||||
publicURL: '/',
|
||||
})
|
||||
.bundle()
|
||||
.then(() => {
|
||||
.then(() =>
|
||||
// Creates a sitemap object given the input configuration with URLs
|
||||
const sitemap = sm.createSitemap({
|
||||
hostname: 'https://awesome-docker.netlify.com/',
|
||||
cacheTime: 6000000, // 600 sec (10 min) cache purge period
|
||||
urls: [
|
||||
{
|
||||
url: '/',
|
||||
changefreq: 'daily',
|
||||
priority: 0.8,
|
||||
lastmodrealtime: true,
|
||||
lastmodfile: 'dist/index.html',
|
||||
},
|
||||
{
|
||||
url: '/table.html',
|
||||
changefreq: 'weekly',
|
||||
priority: 0.8,
|
||||
lastmodrealtime: true,
|
||||
lastmodfile: 'dist/table.html',
|
||||
},
|
||||
],
|
||||
});
|
||||
fs.writeFileSync('dist/sitemap.xml', sitemap.toString());
|
||||
// fs.copyFileSync('website/sitemap.xml', 'dist/sitemap.xml');
|
||||
});
|
||||
fs.outputFile(
|
||||
'dist/sitemap.xml',
|
||||
sm.createSitemap(sitemapOpts).toString(),
|
||||
),
|
||||
);
|
||||
};
|
||||
|
||||
const main = () => {
|
||||
includeReadme();
|
||||
bundle();
|
||||
};
|
||||
async function main() {
|
||||
emojiMapURL = await loadEmoji();
|
||||
await processTable();
|
||||
await processIndex();
|
||||
await bundle();
|
||||
}
|
||||
|
||||
main();
|
||||
|
|
120
buildMetadata.js
120
buildMetadata.js
|
@ -1,28 +1,41 @@
|
|||
const fs = require('fs');
|
||||
const { promisify } = require('util');
|
||||
const fs = require('fs-extra');
|
||||
const fetch = require('node-fetch');
|
||||
const dayjs = require('dayjs');
|
||||
|
||||
require('draftlog').into(console);
|
||||
|
||||
process.on('unhandledRejection', error => {
|
||||
console.log('unhandledRejection', error.message);
|
||||
});
|
||||
const LOG = {
|
||||
error: (...args) => console.error('❌ ERROR', { ...args }),
|
||||
debug: (...args) => {
|
||||
if (process.env.DEBUG) console.log('💡 DEBUG: ', { ...args });
|
||||
},
|
||||
};
|
||||
const handleFailure = err => {
|
||||
LOG.error(err);
|
||||
process.exit(1);
|
||||
};
|
||||
|
||||
process.on('unhandledRejection', handleFailure);
|
||||
|
||||
if (!process.env.TOKEN) {
|
||||
throw new Error('no github token found');
|
||||
LOG.error('no credentials found.');
|
||||
process.exit(1);
|
||||
}
|
||||
|
||||
// --- ENV VAR ---
|
||||
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE, 10) || 10;
|
||||
const DELAY = parseInt(process.env.DELAY, 10) || 3000;
|
||||
// --- FILENAME ---
|
||||
const INTERVAL = parseInt(process.env.INTERVAL, 10) || 1;
|
||||
const INTERVAL_UNIT = process.env.INTERVAL_UNIT || 'days';
|
||||
|
||||
// --- FILES ---
|
||||
const DATA_FOLDER = 'data';
|
||||
const README = 'README.md';
|
||||
const GITHUB_METADATA_FILE = `data/${dayjs().format(
|
||||
'YYYY-MM-DDTHH.mm.ss',
|
||||
)}-fetched_repo_data.json`;
|
||||
const LATEST_FILENAME = 'data/latest';
|
||||
const GITHUB_REPOS = 'data/list_repos.json';
|
||||
const DATE = dayjs().format('YYYY-MM-DDTHH.mm.ss');
|
||||
const GITHUB_METADATA_FILE = `${DATA_FOLDER}/${DATE}-fetched_repo_data.json`;
|
||||
const LATEST_FILENAME = `${DATA_FOLDER}/latest`;
|
||||
const GITHUB_REPOS = `${DATA_FOLDER}/repository.json`;
|
||||
|
||||
// --- HTTP ---
|
||||
const API = 'https://api.github.com/';
|
||||
const options = {
|
||||
|
@ -34,30 +47,29 @@ const options = {
|
|||
},
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
const removeHost = x => x.slice('https://github.com/'.length, x.length);
|
||||
const readFile = promisify(fs.readFile);
|
||||
const writeFile = promisify(fs.writeFile);
|
||||
const printError = err => err && console.error('❌ ERROR', err);
|
||||
const barLine = console.draft('Starting batch...');
|
||||
|
||||
const delay = ms =>
|
||||
new Promise(resolve => {
|
||||
setTimeout(() => resolve(), ms);
|
||||
});
|
||||
|
||||
const get = (path, opt) =>
|
||||
fetch(`${API}repos/${path}`, {
|
||||
const get = (pathURL, opt) => {
|
||||
LOG.debug(`Fetching ${pathURL}`);
|
||||
return fetch(`${API}repos/${pathURL}`, {
|
||||
...options,
|
||||
...opt,
|
||||
})
|
||||
.catch(printError)
|
||||
.catch(handleFailure)
|
||||
.then(response => {
|
||||
if (response.ok) return response.json();
|
||||
throw new Error('Network response was not ok.');
|
||||
})
|
||||
.catch(printError);
|
||||
.catch(handleFailure);
|
||||
};
|
||||
|
||||
const fetchAll = batch => Promise.all(batch.map(async path => get(path)));
|
||||
const fetchAll = batch => Promise.all(batch.map(async pathURL => get(pathURL)));
|
||||
|
||||
const extractAllRepos = markdown => {
|
||||
const re = /https:\/\/github\.com\/([a-zA-Z0-9-._]+)\/([a-zA-Z0-9-._]+)/g;
|
||||
|
@ -68,11 +80,13 @@ const extractAllRepos = markdown => {
|
|||
const ProgressBar = (i, batchSize, total) => {
|
||||
const progress = Math.round((i / total) * 100);
|
||||
const units = Math.round(progress / 2);
|
||||
const barLine = console.draft('Starting batch...');
|
||||
return barLine(
|
||||
`[${'='.repeat(units)}${' '.repeat(50 - units)}] ${progress}% - # ${i}`,
|
||||
);
|
||||
};
|
||||
|
||||
// ----------------------------------------------------------------------------
|
||||
async function batchFetchRepoMetadata(githubRepos) {
|
||||
const repos = githubRepos.map(removeHost);
|
||||
|
||||
|
@ -80,8 +94,9 @@ async function batchFetchRepoMetadata(githubRepos) {
|
|||
/* eslint-disable no-await-in-loop */
|
||||
for (let i = 0; i < repos.length; i += BATCH_SIZE) {
|
||||
const batch = repos.slice(i, i + BATCH_SIZE);
|
||||
if (process.env.DEBUG) console.log({ batch });
|
||||
LOG.debug({ batch });
|
||||
const res = await fetchAll(batch);
|
||||
LOG.debug('batch fetched...');
|
||||
metadata.push(...res);
|
||||
ProgressBar(i, BATCH_SIZE, repos.length);
|
||||
// poor man's rate limiting so github don't ban us
|
||||
|
@ -91,29 +106,58 @@ async function batchFetchRepoMetadata(githubRepos) {
|
|||
return metadata;
|
||||
}
|
||||
|
||||
function shouldUpdate(lastUpdateTime) {
|
||||
LOG.debug({ lastUpdateTime });
|
||||
if (!lastUpdateTime) return true;
|
||||
|
||||
const hours = lastUpdateTime.slice(
|
||||
'data/YYYY-MM-DDT'.length,
|
||||
'data/YYYY-MM-DDTHH'.length,
|
||||
);
|
||||
const latestUpdate = dayjs(
|
||||
lastUpdateTime.slice('data/'.length, 'data/YYYY-MM-DD'.length),
|
||||
).add(hours, 'hour');
|
||||
|
||||
LOG.debug({ latestUpdate: latestUpdate.format() });
|
||||
|
||||
return dayjs().diff(latestUpdate, INTERVAL_UNIT) >= INTERVAL;
|
||||
}
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const markdown = await readFile(README, { encoding: 'utf8' });
|
||||
const githubRepos = extractAllRepos(markdown);
|
||||
await writeFile(
|
||||
GITHUB_REPOS,
|
||||
JSON.stringify(githubRepos, null, 2),
|
||||
printError,
|
||||
);
|
||||
const lastUpdateTime = await fs.readFile(LATEST_FILENAME, 'utf8');
|
||||
LOG.debug('Checking if updating is needed');
|
||||
if (!shouldUpdate(lastUpdateTime)) {
|
||||
LOG.debug('Last update was less than a day ago 😅. Exiting...');
|
||||
process.exit();
|
||||
}
|
||||
|
||||
const markdown = await fs.readFile(README, 'utf8');
|
||||
const githubRepos = extractAllRepos(markdown);
|
||||
LOG.debug('writing repo list to disk...');
|
||||
await fs.outputJSON(GITHUB_REPOS, githubRepos, { spaces: 2 });
|
||||
|
||||
LOG.debug('fetching data...');
|
||||
const metadata = await batchFetchRepoMetadata(githubRepos);
|
||||
|
||||
await writeFile(
|
||||
GITHUB_METADATA_FILE,
|
||||
JSON.stringify(metadata, null, 2),
|
||||
printError,
|
||||
);
|
||||
console.log('✅ metadata saved');
|
||||
LOG.debug('writing metadata to disk...');
|
||||
await fs.outputJSON(GITHUB_METADATA_FILE, metadata, { spaces: 2 });
|
||||
LOG.debug('✅ metadata saved');
|
||||
|
||||
// save the latest
|
||||
fs.writeFile(LATEST_FILENAME, GITHUB_METADATA_FILE, printError);
|
||||
LOG.debug('removing latest...');
|
||||
await fs.remove(LATEST_FILENAME);
|
||||
|
||||
LOG.debug('writing latest...');
|
||||
await fs.outputFile(LATEST_FILENAME, GITHUB_METADATA_FILE);
|
||||
LOG.debug('✅ late update time saved', {
|
||||
LATEST_FILENAME,
|
||||
GITHUB_METADATA_FILE,
|
||||
});
|
||||
|
||||
LOG.debug('gracefully shutting down.');
|
||||
process.exit();
|
||||
} catch (err) {
|
||||
printError(err);
|
||||
handleFailure(err);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
122
buildTable.js
122
buildTable.js
|
@ -1,122 +0,0 @@
|
|||
const fs = require('fs');
|
||||
const cheerio = require('cheerio');
|
||||
const dayjs = require('dayjs');
|
||||
|
||||
const getLatestFilename = fs.readFileSync('data/latest', 'utf-8');
|
||||
console.log(getLatestFilename);
|
||||
const metaData = require(`./${getLatestFilename}`); // eslint-disable-line import/no-dynamic-require
|
||||
|
||||
process.env.NODE_ENV = 'production';
|
||||
|
||||
process.on('unhandledRejection', error => {
|
||||
console.log('unhandledRejection', error.message);
|
||||
});
|
||||
|
||||
const templateHTML = 'website/table.tmpl.html';
|
||||
const destination = 'website/table.html';
|
||||
|
||||
const valueNames = [
|
||||
'name',
|
||||
'description',
|
||||
'homepage',
|
||||
'star',
|
||||
'updated',
|
||||
'language',
|
||||
'license',
|
||||
'author',
|
||||
];
|
||||
|
||||
const getLastUpdate = updated => {
|
||||
const updt = Number(dayjs(updated).diff(dayjs(), 'days'));
|
||||
if (updt < 0) {
|
||||
if (Math.abs(updt) === 1) return `1 day ago`;
|
||||
return `${Math.abs(updt)} days ago`;
|
||||
} else if (updt === 0) return 'today';
|
||||
return updated;
|
||||
};
|
||||
|
||||
const mapHomePage = h => {
|
||||
if (h === 'manageiq.org') return 'https://manageiq.org';
|
||||
else if (h === 'dev-sec.io') return 'https://dev-sec.io';
|
||||
return h;
|
||||
};
|
||||
|
||||
const mapLicense = l => {
|
||||
if (l === 'GNU Lesser General Public License v3.0') return 'GNU LGPL v3.0';
|
||||
else if (l === 'GNU General Public License v2.0') return 'GNU GPL v2.0';
|
||||
else if (l === 'GNU General Public License v3.0') return 'GNU GPL v3.0';
|
||||
else if (l === 'BSD 3-Clause "New" or "Revised" License')
|
||||
return 'BSD 3-Clause';
|
||||
else if (l === 'BSD 2-Clause "Simplified" License') return 'BSD 2-Clause';
|
||||
return l;
|
||||
};
|
||||
|
||||
const formatEntry = (
|
||||
{
|
||||
name,
|
||||
html_url: repoURL,
|
||||
description,
|
||||
homepage,
|
||||
stargazers_count: stargazers,
|
||||
pushed_at: updated,
|
||||
language,
|
||||
license,
|
||||
owner,
|
||||
},
|
||||
i,
|
||||
) =>
|
||||
[
|
||||
`<li data-id="${i}">`,
|
||||
`<a href="${repoURL}" class="link ${valueNames[0]}">${name}</a>`,
|
||||
`<p class="${valueNames[1]}">${description || '-'}</p>`,
|
||||
`<p class="${
|
||||
valueNames[4]
|
||||
} timestamp" data-timestamp="${updated}">Last code update: ${getLastUpdate(
|
||||
updated,
|
||||
)}</p>`,
|
||||
(homepage &&
|
||||
`<a href="${mapHomePage(homepage)}" class="link ${
|
||||
valueNames[2]
|
||||
}">website</a>`) ||
|
||||
'<p></p>',
|
||||
`<p class="${
|
||||
valueNames[3]
|
||||
} timestamp" data-timestamp="${stargazers}">⭐️${stargazers}</p>`,
|
||||
(language && `<p class="${valueNames[5]}">💻${language}</p>`) || '<p></p>',
|
||||
(license &&
|
||||
license.url !== null &&
|
||||
`<a href="${license.url}" class="link ${valueNames[6]}">${mapLicense(
|
||||
license.name,
|
||||
)}</a>`) ||
|
||||
'<p></p>',
|
||||
owner &&
|
||||
`<p>Made by </p><a href="${owner.html_url}" class="link ${
|
||||
valueNames[7]
|
||||
}">${owner.login}</a>`,
|
||||
'</li>',
|
||||
].join('');
|
||||
|
||||
function main() {
|
||||
const indexTemplate = fs.readFileSync(templateHTML, 'utf8');
|
||||
const $ = cheerio.load(indexTemplate);
|
||||
const btn = valueNames.map(
|
||||
v => `<button class="sort" data-sort="${v}">${v} </button>`,
|
||||
);
|
||||
$('#md').append(
|
||||
[
|
||||
`<div class="container">`,
|
||||
`<div class="searchbar" ><input class="search" placeholder="Search" /></div>`,
|
||||
`<div class="sortbtn" ><p>Sort by</p>${btn.join('')}</div>`,
|
||||
`</div>`,
|
||||
'<ul class="list">',
|
||||
metaData.map(formatEntry).join(''),
|
||||
'</ul>',
|
||||
].join(''),
|
||||
);
|
||||
|
||||
console.log('Writing table.html');
|
||||
fs.writeFileSync(destination, $.html(), 'utf8');
|
||||
console.log('DONE 👍');
|
||||
}
|
||||
|
||||
main();
|
35337
data/2018-07-18T18.35.04-fetched_repo_data.json
Normal file
35337
data/2018-07-18T18.35.04-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-20T08.03.16-fetched_repo_data.json
Normal file
35337
data/2018-07-20T08.03.16-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-21T16.13.29-fetched_repo_data.json
Normal file
35337
data/2018-07-21T16.13.29-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-22T16.13.48-fetched_repo_data.json
Normal file
35337
data/2018-07-22T16.13.48-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-23T16.13.52-fetched_repo_data.json
Normal file
35337
data/2018-07-23T16.13.52-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-24T16.14.14-fetched_repo_data.json
Normal file
35337
data/2018-07-24T16.14.14-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-25T16.14.28-fetched_repo_data.json
Normal file
35337
data/2018-07-25T16.14.28-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35337
data/2018-07-26T16.15.20-fetched_repo_data.json
Normal file
35337
data/2018-07-26T16.15.20-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-07-27T16.17.37-fetched_repo_data.json
Normal file
35469
data/2018-07-27T16.17.37-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-07-28T16.16.08-fetched_repo_data.json
Normal file
35469
data/2018-07-28T16.16.08-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-07-29T16.16.56-fetched_repo_data.json
Normal file
35469
data/2018-07-29T16.16.56-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-07-30T16.17.28-fetched_repo_data.json
Normal file
35469
data/2018-07-30T16.17.28-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-07-31T16.18.01-fetched_repo_data.json
Normal file
35469
data/2018-07-31T16.18.01-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-08-01T16.19.07-fetched_repo_data.json
Normal file
35469
data/2018-08-01T16.19.07-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-08-02T16.19.15-fetched_repo_data.json
Normal file
35469
data/2018-08-02T16.19.15-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-08-03T16.20.24-fetched_repo_data.json
Normal file
35469
data/2018-08-03T16.20.24-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-08-04T16.20.50-fetched_repo_data.json
Normal file
35469
data/2018-08-04T16.20.50-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35469
data/2018-08-05T16.21.12-fetched_repo_data.json
Normal file
35469
data/2018-08-05T16.21.12-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35701
data/2018-08-07T16.23.09-fetched_repo_data.json
Normal file
35701
data/2018-08-07T16.23.09-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35701
data/2018-08-08T16.30.12-fetched_repo_data.json
Normal file
35701
data/2018-08-08T16.30.12-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
35701
data/2018-08-09T16.23.14-fetched_repo_data.json
Normal file
35701
data/2018-08-09T16.23.14-fetched_repo_data.json
Normal file
File diff suppressed because it is too large
Load diff
157
data/category.json
Normal file
157
data/category.json
Normal file
|
@ -0,0 +1,157 @@
|
|||
[
|
||||
{
|
||||
"id": 0,
|
||||
"name": "Others",
|
||||
"description": "Awesome projects"
|
||||
},
|
||||
{
|
||||
"id": 1,
|
||||
"name": "Container Operations",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 2,
|
||||
"name": "Container Composition",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 3,
|
||||
"name": "Deployment and Infrastructure",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 4,
|
||||
"name": "Monitoring",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 5,
|
||||
"name": "Networking",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 6,
|
||||
"name": "Orchestration",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 7,
|
||||
"name": "PaaS",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 8,
|
||||
"name": "Reverse Proxy",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 9,
|
||||
"name": "Security",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 10,
|
||||
"name": "Service Discovery",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 11,
|
||||
"name": "Volume Management / Data",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 12,
|
||||
"name": "User Interface / Desktop",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 13,
|
||||
"name": "User Interface / Terminal",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 14,
|
||||
"name": "User Interface / Web",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 15,
|
||||
"name": "Docker Images",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 16,
|
||||
"name": "Base Tools",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 17,
|
||||
"name": "Builder",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 18,
|
||||
"name": "Dockerfile",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 19,
|
||||
"name": "Linter",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 20,
|
||||
"name": "Metadata",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 21,
|
||||
"name": "Registry",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 22,
|
||||
"name": "Development with Docker",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 23,
|
||||
"name": "API Client",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 24,
|
||||
"name": "CI/CD",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 25,
|
||||
"name": "Development Environment",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 26,
|
||||
"name": "Garbage Collection",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 27,
|
||||
"name": "Serverless",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 28,
|
||||
"name": "Testing",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 29,
|
||||
"name": "Wrappers",
|
||||
"description": "description"
|
||||
},
|
||||
{
|
||||
"id": 30,
|
||||
"name": "Where to start",
|
||||
"description": "description"
|
||||
}
|
||||
]
|
|
@ -1 +1 @@
|
|||
data/2018-07-09T08.41.40-fetched_repo_data.json
|
||||
data/2018-08-09T16.23.14-fetched_repo_data.json
|
1512
data/mapping.json
Normal file
1512
data/mapping.json
Normal file
File diff suppressed because it is too large
Load diff
|
@ -20,7 +20,7 @@
|
|||
"https://github.com/abesto/docker-compose-graphviz",
|
||||
"https://github.com/Alexis-benoist/draw-compose",
|
||||
"https://github.com/cisco/elsy",
|
||||
"https://github.com/cloud66/habitus",
|
||||
"https://github.com/cloud66-oss/habitus",
|
||||
"https://github.com/toscanini/maestro",
|
||||
"https://github.com/ihucos/plash",
|
||||
"https://github.com/grammarly/rocker-compose",
|
||||
|
@ -34,7 +34,7 @@
|
|||
"https://github.com/ttiny/deploy",
|
||||
"https://github.com/humblec/dockit",
|
||||
"https://github.com/hasura/gitkube",
|
||||
"https://github.com/Grafeas/Grafeas",
|
||||
"https://github.com/grafeas/grafeas",
|
||||
"https://github.com/longshoreman/longshoreman",
|
||||
"https://github.com/axibase/atsd-use-cases",
|
||||
"https://github.com/google/cadvisor",
|
||||
|
@ -46,6 +46,7 @@
|
|||
"https://github.com/gocardless/logjam",
|
||||
"https://github.com/sematext/logagent-js",
|
||||
"https://github.com/gliderlabs/logspout",
|
||||
"https://github.com/TheNexCloud/NexClipper",
|
||||
"https://github.com/uschtwill/docker_monitoring_logging_alerting",
|
||||
"https://github.com/monitoringartist/Zabbix-Docker-Monitoring",
|
||||
"https://github.com/gomex/docker-zabbix",
|
||||
|
@ -171,6 +172,7 @@
|
|||
"https://github.com/alibaba/derrick",
|
||||
"https://github.com/wercker/dlayer",
|
||||
"https://github.com/mudler/docker-companion",
|
||||
"https://github.com/avirshup/DockerMake",
|
||||
"https://github.com/CtripCloud/docker-make",
|
||||
"https://github.com/bcicen/docker-replay",
|
||||
"https://github.com/docker-slim/docker-slim",
|
||||
|
@ -181,6 +183,7 @@
|
|||
"https://github.com/duedil-ltd/portainer",
|
||||
"https://github.com/lavie/runlike",
|
||||
"https://github.com/djosephsen/skinnywhale",
|
||||
"https://github.com/oracle/smith",
|
||||
"https://github.com/P3GLEG/Whaler",
|
||||
"https://github.com/Gueils/whales",
|
||||
"https://github.com/garywiz/chaperone-docker",
|
||||
|
@ -230,13 +233,14 @@
|
|||
"https://github.com/binci/binci",
|
||||
"https://github.com/boot2docker/boot2docker",
|
||||
"https://github.com/lstephen/construi",
|
||||
"https://github.com/oracle/crashcart",
|
||||
"https://github.com/fgrehm/devstep",
|
||||
"https://github.com/codekitchen/dinghy",
|
||||
"https://github.com/nlf/dlite",
|
||||
"https://github.com/dnephin/dobi",
|
||||
"https://github.com/nandoquintana/docker-missing-tools",
|
||||
"https://github.com/brikis98/docker-osx-dev",
|
||||
"https://github.com/ph3nol/docker-arch",
|
||||
"https://github.com/Ph3nol/Docker-Arch",
|
||||
"https://github.com/EugenMayer/docker-sync",
|
||||
"https://github.com/shyiko/docker-vm",
|
||||
"https://github.com/PhilippHeuer/EnvCLI",
|
||||
|
@ -244,7 +248,7 @@
|
|||
"https://github.com/lando/lando",
|
||||
"https://github.com/tailhook/vagga",
|
||||
"https://github.com/tjamet/caduc",
|
||||
"https://github.com/zzrotdesign/docker-clean",
|
||||
"https://github.com/ZZROTDesign/docker-clean",
|
||||
"https://github.com/meltwater/docker-cleanup",
|
||||
"https://github.com/Yelp/docker-custodian",
|
||||
"https://github.com/konstruktoid/docker-garby",
|
||||
|
@ -293,9 +297,8 @@
|
|||
"https://github.com/kiyoto/docker-fluentd",
|
||||
"https://github.com/inspec/inspec",
|
||||
"https://github.com/jessfraz/dockerfiles",
|
||||
"https://github.com/jessfraz/dotfiles",
|
||||
"https://github.com/jwilder/nginx-proxy",
|
||||
"https://github.com/ashmckenzie/percheron",
|
||||
"https://github.com/sematext/sematext-agent-docker",
|
||||
"https://github.com/weaveworks/weave"
|
||||
]
|
||||
]
|
110
fetchRepos.js
110
fetchRepos.js
|
@ -1,110 +0,0 @@
|
|||
const fs = require('fs');
|
||||
const { promisify } = require('util');
|
||||
const fetch = require('node-fetch');
|
||||
const dayjs = require('dayjs');
|
||||
|
||||
require('draftlog').into(console);
|
||||
|
||||
process.on('unhandledRejection', error => {
|
||||
console.log('unhandledRejection', error.message);
|
||||
});
|
||||
|
||||
if (!process.env.TOKEN) {
|
||||
throw new Error('no github token found');
|
||||
}
|
||||
|
||||
// --- ENV VAR ---
|
||||
const BATCH_SIZE = parseInt(process.env.BATCH_SIZE, 10) || 10;
|
||||
const DELAY = parseInt(process.env.DELAY, 10) || 3000;
|
||||
// --- FILENAME ---
|
||||
const README = 'README.md';
|
||||
const GITHUB_METADATA_FILE = `data/${dayjs().format(
|
||||
'YYYY-MM-DDTHH.mm.ss',
|
||||
)}-fetched_repo_data.json`;
|
||||
const GITHUB_REPOS = 'data/list_repos.json';
|
||||
// --- HTTP ---
|
||||
const API = 'https://api.github.com/';
|
||||
const options = {
|
||||
method: 'GET',
|
||||
headers: {
|
||||
'User-Agent': 'awesome-docker script listing',
|
||||
'Content-Type': 'application/json',
|
||||
Authorization: `token ${process.env.TOKEN}`,
|
||||
},
|
||||
};
|
||||
|
||||
// --- UTILS ---
|
||||
function get(path, opt) {
|
||||
return fetch(`${API}repos/${path}`, {
|
||||
...options,
|
||||
...opt,
|
||||
})
|
||||
.catch(err => console.error(err))
|
||||
.then(r => {
|
||||
if (r.ok) return r.json();
|
||||
throw new Error('Network response was not ok.');
|
||||
})
|
||||
.catch(err => console.error(err));
|
||||
}
|
||||
const delay = ms =>
|
||||
new Promise(resolve => {
|
||||
setTimeout(() => resolve(), ms);
|
||||
});
|
||||
|
||||
const extractAllRepos = markdown => {
|
||||
const re = /https:\/\/github\.com\/([a-zA-Z0-9-._]+)\/([a-zA-Z0-9-._]+)/g;
|
||||
const md = markdown.match(re);
|
||||
return [...new Set(md)];
|
||||
};
|
||||
|
||||
const barLine = console.draft('Starting batch...');
|
||||
|
||||
const ProgressBar = (i, batchSize, total) => {
|
||||
const progress = Math.round((i / total) * 100);
|
||||
const units = Math.round(progress / 2);
|
||||
return barLine(
|
||||
`[${'='.repeat(units)}${' '.repeat(50 - units)}] ${progress}% - # ${i}`,
|
||||
);
|
||||
};
|
||||
|
||||
const removeHost = x => x.slice('https://github.com/'.length, x.length);
|
||||
|
||||
const readFile = promisify(fs.readFile);
|
||||
|
||||
// ------------------------------------------------------------
|
||||
|
||||
async function main() {
|
||||
try {
|
||||
const markdown = await readFile(README, { encoding: 'utf8' });
|
||||
const githubRepos = extractAllRepos(markdown);
|
||||
fs.writeFile(
|
||||
GITHUB_REPOS,
|
||||
JSON.stringify(githubRepos, null, 2),
|
||||
err => err && console.error('FILE ERROR', err),
|
||||
);
|
||||
|
||||
const repos = githubRepos.map(removeHost);
|
||||
|
||||
const metadata = [];
|
||||
/* eslint-disable no-await-in-loop */
|
||||
for (let i = 0; i < repos.length; i += BATCH_SIZE) {
|
||||
const batch = repos.slice(i, i + BATCH_SIZE);
|
||||
if (process.env.DEBUG) console.log({ batch });
|
||||
const res = await Promise.all(batch.map(async path => get(path)));
|
||||
metadata.push(...res);
|
||||
ProgressBar(i, BATCH_SIZE, repos.length);
|
||||
await delay(DELAY);
|
||||
}
|
||||
|
||||
fs.writeFile(
|
||||
GITHUB_METADATA_FILE,
|
||||
JSON.stringify(metadata, null, 2),
|
||||
err => err && console.error(err),
|
||||
);
|
||||
ProgressBar(repos.length, BATCH_SIZE, repos.length);
|
||||
} catch (err) {
|
||||
console.error('ERROR:', err);
|
||||
}
|
||||
}
|
||||
|
||||
main();
|
10367
package-lock.json
generated
Normal file
10367
package-lock.json
generated
Normal file
File diff suppressed because it is too large
Load diff
42
package.json
42
package.json
|
@ -2,9 +2,9 @@
|
|||
"name": "awesome-docker-website",
|
||||
"version": "1.0.0",
|
||||
"description": "A curated list of Docker resources and projects Inspired by @sindresorhus and improved by amazing contributors",
|
||||
"main": "index.js",
|
||||
"main": "build.js",
|
||||
"scripts": {
|
||||
"build": "node buildTable.js && rimraf ./dist/ && node build.js"
|
||||
"build": "rimraf ./dist/ && node build.js"
|
||||
},
|
||||
"repository": {
|
||||
"type": "git",
|
||||
|
@ -17,26 +17,26 @@
|
|||
},
|
||||
"homepage": "https://github.com/veggiemonk/awesome-docker#readme",
|
||||
"dependencies": {
|
||||
"cheerio": "^1.0.0-rc.2",
|
||||
"critical": "^1.3.3",
|
||||
"dayjs": "^1.6.6",
|
||||
"draftlog": "^1.0.12",
|
||||
"jsdom": "^11.11.0",
|
||||
"list.js": "^1.5.0",
|
||||
"node-fetch": "^2.1.2",
|
||||
"parcel-bundler": "^1.8.1",
|
||||
"rimraf": "^2.6.2",
|
||||
"showdown": "^1.8.6",
|
||||
"sitemap": "^1.13.0"
|
||||
"cheerio": "1.0.0-rc.2",
|
||||
"critical": "1.3.3",
|
||||
"dayjs": "1.6.6",
|
||||
"draftlog": "1.0.12",
|
||||
"fs-extra": "7.0.0",
|
||||
"list.js": "1.5.0",
|
||||
"node-fetch": "2.1.2",
|
||||
"parcel-bundler": "1.8.1",
|
||||
"rimraf": "2.6.2",
|
||||
"showdown": "1.8.6",
|
||||
"sitemap": "1.13.0"
|
||||
},
|
||||
"devDependencies": {
|
||||
"babel-eslint": "^8.2.3",
|
||||
"eslint": "^4.19.1",
|
||||
"eslint-config-airbnb-base": "^12.1.0",
|
||||
"eslint-config-prettier": "^2.9.0",
|
||||
"eslint-plugin-import": "^2.12.0",
|
||||
"eslint-plugin-jsx-a11y": "^6.0.3",
|
||||
"eslint-plugin-prettier": "^2.6.0",
|
||||
"prettier": "^1.13.5"
|
||||
"babel-eslint": "8.2.6",
|
||||
"eslint": "4.19.1",
|
||||
"eslint-config-airbnb-base": "12.1.0",
|
||||
"eslint-config-prettier": "2.9.0",
|
||||
"eslint-plugin-import": "2.13.0",
|
||||
"eslint-plugin-jsx-a11y": "6.1.1",
|
||||
"eslint-plugin-prettier": "2.6.2",
|
||||
"prettier": "1.13.7"
|
||||
}
|
||||
}
|
||||
|
|
26
push.sh
Executable file
26
push.sh
Executable file
|
@ -0,0 +1,26 @@
|
|||
#!/usr/bin/env bash
|
||||
|
||||
# Exit immediately if a command returns a non-zero status.
|
||||
set -e
|
||||
|
||||
# Set git credentials
|
||||
git config --global user.email "info@veggiemonk.ovh"
|
||||
git config --global user.name "veggiemonk-bot"
|
||||
|
||||
# let git know where to apply the changes
|
||||
git checkout master
|
||||
|
||||
echo "Adding data files"
|
||||
git add data/*
|
||||
|
||||
echo "Checking the number of files staged"
|
||||
files=$(git diff --cached --numstat | wc -l | tr -d '[:space:]');
|
||||
[[ $files -eq 0 ]] && echo "nothing to push, exiting..." && exit
|
||||
|
||||
echo "Commiting files"
|
||||
git commit -m "Automated update repository metadata [skip ci]"
|
||||
|
||||
echo "Pushing changes"
|
||||
git push https://$GITHUB_USER:$GITHUB_TOKEN@github.com/veggiemonk/awesome-docker master >/dev/null 2>&1
|
||||
|
||||
echo "Done."
|
|
@ -6,7 +6,7 @@ const main = () => {
|
|||
'name',
|
||||
'description',
|
||||
'homepage',
|
||||
'star',
|
||||
{ name: 'star', attr: 'data-stars' },
|
||||
{ name: 'updated', attr: 'data-timestamp' },
|
||||
'language',
|
||||
'license',
|
||||
|
|
|
@ -13,7 +13,7 @@
|
|||
<meta name="google-site-verification" content="_yiugvz0gCtfsBLyLl1LnkALXb6D4ofiwCyV1XOlYBM" />
|
||||
<link rel="icon" type="image/png" href="favicon.png">
|
||||
<style>
|
||||
:root {
|
||||
:root {
|
||||
--main-list-header: #5dbcd2;
|
||||
--main-list-footer: #5dbcd2;
|
||||
}
|
||||
|
@ -58,7 +58,7 @@ h1 {
|
|||
img {
|
||||
border: 0
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
.btn {
|
||||
display: inline-block;
|
||||
margin-bottom: 1rem;
|
||||
|
@ -67,36 +67,28 @@ img {
|
|||
border: 1px solid hsla(0, 0%, 100%, .2);
|
||||
border-radius: .3rem
|
||||
}
|
||||
|
||||
.page-header {
|
||||
color: #fff;
|
||||
text-align: center;
|
||||
background-color: #5DBCD2;
|
||||
background-image: linear-gradient(120deg, #155799, #5DBCD2)
|
||||
}
|
||||
|
||||
.project-name {
|
||||
margin-top: 0;
|
||||
margin-bottom: .1rem
|
||||
}
|
||||
|
||||
.project-tagline {
|
||||
margin-bottom: 2rem;
|
||||
font-weight: 400;
|
||||
opacity: .7
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
|
||||
.container {
|
||||
display: grid;
|
||||
grid-template-columns: 1fr 1fr;
|
||||
margin-top: 1rem;
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
.searchbar {
|
||||
display: flex;
|
||||
justify-content: center;
|
||||
|
@ -108,7 +100,6 @@ img {
|
|||
width: 18rem;
|
||||
font-size: 2.5rem;
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
|
||||
.sortbtn {
|
||||
|
@ -177,7 +168,13 @@ img {
|
|||
right: -5px;
|
||||
}
|
||||
|
||||
/*******************************************************/
|
||||
/*=========================================================================*/
|
||||
.emoji {
|
||||
height: 1rem;
|
||||
width: 1rem;
|
||||
}
|
||||
/*=========================================================================*/
|
||||
|
||||
|
||||
.list {
|
||||
display: grid;
|
||||
|
|
Loading…
Add table
Add a link
Reference in a new issue