├── 006-nodejs ├── .dockerignore ├── package.json ├── server.js └── Dockerfile ├── 002-static ├── Dockerfile ├── images │ └── hello.png └── index.html ├── .DS_Store ├── 001-static ├── Dockerfile └── index.html ├── 005-ubuntu ├── readme.md ├── app.js ├── package.json ├── Dockerfile └── package-lock.json ├── 003-php ├── Dockerfile └── index.php ├── 009-mssql └── readme.md ├── 008-mysql └── readme.md ├── 004-python ├── Dockerfile ├── readme.md └── app.py ├── 010-mongoDB └── readme.md ├── 007-volumeMount └── readme.md ├── installDocker.sh └── readme.md /006-nodejs/.dockerignore: -------------------------------------------------------------------------------- 1 | node_modules 2 | npm-debug.log 3 | -------------------------------------------------------------------------------- /002-static/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:latest 2 | COPY . /usr/share/nginx/html -------------------------------------------------------------------------------- /.DS_Store: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uqutub/piaic-docker-cnc/HEAD/.DS_Store -------------------------------------------------------------------------------- /001-static/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM nginx:alpine 2 | COPY . /usr/share/nginx/html 3 | -------------------------------------------------------------------------------- /005-ubuntu/readme.md: -------------------------------------------------------------------------------- 1 | ```sh 2 | $ docker run -it ubuntu /bin/bash 3 | ``` 4 | -------------------------------------------------------------------------------- /003-php/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM php:apache 2 | COPY index.php /var/www/html 3 | EXPOSE 80 4 | -------------------------------------------------------------------------------- /003-php/index.php: -------------------------------------------------------------------------------- 1 | 5 | -------------------------------------------------------------------------------- /002-static/images/hello.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/uqutub/piaic-docker-cnc/HEAD/002-static/images/hello.png -------------------------------------------------------------------------------- /001-static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | My First Web App 5 | 6 | 7 |

Hello World Docker

8 | 9 | 10 | -------------------------------------------------------------------------------- /009-mssql/readme.md: -------------------------------------------------------------------------------- 1 | ```sh 2 | $ docker run -e "ACCEPT_EULA=Y" -e "SA_PASSWORD=mypassword" -e "MSSQL_PID=Express" -p 1433:1433 -v /path/your/myfolder:/var/opt/mssql --name HIMS-WEB -d microsoft/mssql-server-linux:latest 3 | ``` -------------------------------------------------------------------------------- /008-mysql/readme.md: -------------------------------------------------------------------------------- 1 | ```sh 2 | $ docker run -p 3306:3306 --name mysqlserver -e MYSQL_ROOT_PASSWORD=root -d -v /home/mysql-data:/var/lib/mysql mysql 3 | ``` 4 | #### Listing existing mounts 5 | ```sh 6 | $ docker inspect mysqlserver 7 | ``` 8 | -------------------------------------------------------------------------------- /005-ubuntu/app.js: -------------------------------------------------------------------------------- 1 | const express = require('express'); 2 | const app = express(); 3 | const port = 3000; 4 | 5 | app.get('/', (req, res) => res.send('Hello World! NodeJS')); 6 | 7 | app.listen(port, () => console.log(`Example app listening on port ${port}!`)); 8 | -------------------------------------------------------------------------------- /004-python/Dockerfile: -------------------------------------------------------------------------------- 1 | # Use an official Python runtime as a parent image 2 | FROM python:2.7-slim 3 | WORKDIR /app 4 | ADD . /app 5 | RUN pip install --trusted-host pypi.python.org Flask 6 | ENV NAME World 7 | ENV BGNAME=purple 8 | EXPOSE 4000 9 | CMD ["python", "app.py"] 10 | -------------------------------------------------------------------------------- /002-static/index.html: -------------------------------------------------------------------------------- 1 | 2 | 3 | 4 | Hello world 5 | 6 | 7 |
8 |

Hello World

9 | 10 |
11 | 12 | -------------------------------------------------------------------------------- /006-nodejs/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "docker_web_app", 3 | "version": "1.0.0", 4 | "description": "Node.js on Docker", 5 | "author": "Yousuf Qutubuddin ", 6 | "main": "server.js", 7 | "scripts": { 8 | "start": "node server.js" 9 | }, 10 | "dependencies": { 11 | "express": "^4.16.1" 12 | } 13 | } 14 | -------------------------------------------------------------------------------- /006-nodejs/server.js: -------------------------------------------------------------------------------- 1 | 'use strict'; 2 | 3 | const express = require('express'); 4 | 5 | // Constants 6 | const PORT = 8080; 7 | const HOST = '0.0.0.0'; 8 | 9 | // App 10 | const app = express(); 11 | app.get('/', (req, res) => { 12 | res.send('Hello world\n'); 13 | }); 14 | 15 | app.listen(PORT, HOST); 16 | console.log(`Running on http://${HOST}:${PORT}`); 17 | -------------------------------------------------------------------------------- /004-python/readme.md: -------------------------------------------------------------------------------- 1 | docker build -t mypyweb . 2 | 3 | docker run --name webapp -p 8080:4000 mypyweb 4 | 5 | docker run --name webapp -p 8080:4000 -e NAME="Dude" -e BGNAME="blue" mypyweb 6 | 7 | #### Share an image 8 | docker login 9 | docker tag mypyweb uqutub/python-example:1.0 10 | docker push uqutub/python-example:1.0 11 | docker run -p 8080:4000 --name webapp -e NAME="Docker Hub" uqutub/python-example:1.0 12 | -------------------------------------------------------------------------------- /004-python/app.py: -------------------------------------------------------------------------------- 1 | from flask import Flask 2 | import os 3 | import socket 4 | 5 | app = Flask(__name__) 6 | @app.route("/") 7 | 8 | def hello(): 9 | html = "

Hello {name}!

Hostname: {hostname}
" 10 | return html.format(name=os.getenv("NAME", "world"), hostname=socket.gethostname(), bgname=os.getenv("BGNAME", "orange")) 11 | 12 | if __name__ == "__main__": 13 | app.run(host='0.0.0.0', port=4000) 14 | -------------------------------------------------------------------------------- /006-nodejs/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM node:8 2 | 3 | # Create app directory 4 | WORKDIR /usr/src/app 5 | 6 | # Install app dependencies 7 | # A wildcard is used to ensure both package.json AND package-lock.json are copied 8 | # where available (npm@5+) 9 | COPY package*.json ./ 10 | 11 | RUN npm install 12 | # If you are building your code for production 13 | # RUN npm ci --only=production 14 | 15 | # Bundle app source 16 | COPY . . 17 | 18 | EXPOSE 8080 19 | CMD [ "npm", "start" ] 20 | -------------------------------------------------------------------------------- /005-ubuntu/package.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demojsapp", 3 | "version": "1.0.0", 4 | "description": "demo nodejs app in ubuntu", 5 | "main": "app.js", 6 | "scripts": { 7 | "test": "echo \"Error: no test specified\" && exit 1" 8 | }, 9 | "repository": { 10 | "type": "git", 11 | "url": "https://github.com/uqutub/piaic-docker-cnc.git" 12 | }, 13 | "author": "Yousuf Qutubuddin", 14 | "license": "ISC", 15 | "dependencies": { 16 | "express": "^4.17.0" 17 | } 18 | } 19 | -------------------------------------------------------------------------------- /010-mongoDB/readme.md: -------------------------------------------------------------------------------- 1 | ### The docker run -d -p 27017:27107 -v ~/data:/data/db mongo does 3 main things: 2 | 3 | ```sh 4 | $ docker run -d -p 27017:27107 -v ~/data:/data/db mongo 5 | ``` 6 | 7 | - -d tells docker to run the container as a daemon, which is the mode that'll you want to use for server containers. 8 | - -p 27017:27107 maps the port 27017 of the container to the port 27017 of the host. The syntax is -p HOST_PORT:CONTAINER_PORT. 9 | - -v ~/data:/data/db maps the /data/db directory of the container to the ~/data directory on the host. This is called a data volume, the principal mechanism to import and export data with your docker container. -------------------------------------------------------------------------------- /007-volumeMount/readme.md: -------------------------------------------------------------------------------- 1 | ```sh 2 | $ docker run -v /full/path/to/html/directory:/usr/share/nginx/html:ro -p 8080:80 -d nginx:alpine 3 | ``` 4 | 5 | When we execute this command line, we see Docker download the Nginx image and then start the container. 6 | We used four command line options to run this container: 7 | - -v /full/path/to/html/directory:/usr/share/nginx/html:ro maps the directory holding our web page to the required location in the image. The ro field instructs Docker to mount it in read-only mode. It’s best to pass Docker the full paths when specifying host directories. 8 | - -p 8080:80 maps network service port 80 in the container to 8080 on our host system. 9 | - -d detaches the container from our command line session. we don’t want to interact with this container. 10 | - nginx is the name of the image. 11 | -------------------------------------------------------------------------------- /005-ubuntu/Dockerfile: -------------------------------------------------------------------------------- 1 | FROM ubuntu:16.04 2 | 3 | RUN apt-get update 4 | RUN apt-get upgrade -y 5 | RUN apt-get dist-upgrade -y 6 | RUN apt-get install curl htop git zip nano ncdu build-essential chrpath libssl-dev libxft-dev pkg-config glib2.0-dev libexpat1-dev gobject-introspection python-gi-dev apt-transport-https libgirepository1.0-dev libtiff5-dev libjpeg-turbo8-dev libgsf-1-dev fail2ban nginx -y 7 | 8 | # Install Node.js 9 | RUN curl -sL https://deb.nodesource.com/setup_8.x | bash 10 | RUN apt-get install --yes nodejs 11 | RUN node -v 12 | RUN npm -v 13 | RUN npm i -g nodemon 14 | RUN nodemon -v 15 | 16 | # Cleanup 17 | RUN apt-get update && apt-get upgrade -y && apt-get autoremove -y 18 | 19 | # Node App 20 | COPY . /app 21 | WORKDIR /app 22 | 23 | # Install app dependencies 24 | RUN npm install 25 | 26 | # Binds to port 3000 27 | EXPOSE 3000 28 | 29 | # Defines your runtime(define default command) 30 | # These commands unlike RUN (they are carried out in the construction of the container) are run when the container 31 | CMD ["node", "app.js"] 32 | -------------------------------------------------------------------------------- /installDocker.sh: -------------------------------------------------------------------------------- 1 | #!/bin/sh 2 | echo -------------------------------------------- 3 | echo Installing Script, Docker created by: Uqutub 4 | echo -------------------------------------------- 5 | echo Updating the apt package index: 6 | echo -------------------------------------------- 7 | sudo apt-get update 8 | echo -------------------------------------------- 9 | echo Installing packages to allow apt to use a repository over HTTPS: 10 | echo -------------------------------------------- 11 | sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common 12 | echo -------------------------------------------- 13 | echo Adding Docker’s official key GPG 14 | echo -------------------------------------------- 15 | curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - 16 | echo -------------------------------------------- 17 | echo Verifying that you now have the key with fingerprint: 18 | echo -------------------------------------------- 19 | sudo apt-key fingerprint 0EBFCD88 20 | echo -------------------------------------------- 21 | echo sub-command below returns the name of your Ubuntu distribution: 22 | echo -------------------------------------------- 23 | sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 24 | echo -------------------------------------------- 25 | echo Updating the apt package index: 26 | echo -------------------------------------------- 27 | sudo apt-get update 28 | echo -------------------------------------------- 29 | echo Installing the latest version of Docker CE and containerd, 30 | echo -------------------------------------------- 31 | sudo apt-get -y install docker-ce docker-ce-cli containerd.io 32 | -------------------------------------------------------------------------------- /readme.md: -------------------------------------------------------------------------------- 1 | # Docker 2 | 3 | #### Build Image 4 | 5 | > docker build -t <image-name>:<tag> . 6 | ```sh 7 | $ docker build -t myapp:1 . 8 | ``` 9 | 10 | #### Run Container 11 | > docker run --name <container-name> -p <host-port>:<container-port> <image-name>:<tag> 12 | ```sh 13 | $ docker run --name cont-name -p 8080:80 myapp:1 14 | ``` 15 | 16 | #### For Test 17 | 18 | ```sh 19 | $ curl http://localhost:8080 20 | ``` 21 | #### Cleanup 22 | Running container can be stopped by 23 | ```sh 24 | $ docker stop cont-name 25 | ``` 26 | and removed by 27 | ```sh 28 | $ docker rm cont-name 29 | ``` 30 | With the image it is even simpler. In order to remove it run 31 | ```sh 32 | $ docker rmi myapp:1 33 | ``` 34 | (before removing any Docker image you always must stop all containers that uses the image). 35 | 36 | *** 37 | 38 | ### Cheat Sheet 39 | 40 | | Command | Description | 41 | | ------ | ------ | 42 | | docker pull user/<image-name>:<tag> | Pulls the image from the docker hub | 43 | | build -t <image-name>:<tag> . | Builds the image from the Dockerfile with the mentioned name and tag | 44 | | docker image ls | Shows the list of the images present on your system. short-hand 'docker images' | 45 | | docker container ls | Displays the only running containers. short-hand 'docker ps' | 46 | | docker container ls -a | Displays all the containers present on your system. short-hand 'docker ps -a' | 47 | | docker inspect <image name>:<tag> | Shows the detailed information about the image in JSON format. | 48 | | docker history <image name>:<tag> | Used to inspect the layers of the image. | 49 | | docker tag <source-image>:<tag> <new-image-name>:<tag> | Create a tag of the new image that refers to source image. | 50 | |docker push user/<image-name>:<tag> | Push an image to a registry | 51 | | docker image rm <image name>:<tag> | Remove the image. short-hand 'docker rmi <image name>:<tag>' | 52 | | docker run --name <container_name> -p <host:port> -d <image_name> | Create the container with the specified name and assign the specified port from the image. | 53 | | docker run --name <container-name> -it -p <host-port> <image-name>:<tag> sh | To run a container from an image in an interactive mode. Press Ctrl + pq it will detach terminal and leave container running in background. | 54 | | docker exec -it <container_name> sh | To go in the running container shell. Write exit to detach the terminal | 55 | | docker stop container_name | It will stop the running container. | 56 | | docker start container_name | Start the stopped container | 57 | | docker rm container_name | Remove the container. | 58 | | docker logs container_name | fetch the logs of the container | 59 | | docker volume create my-vol | Create your Volume for Persistent Data | 60 | | docker volumes ls | List down the volumes | 61 | | docker volume inspect my-vol | inspect the volumes | 62 | | docker volumes rm my-vol | remove volume | 63 | | docker run -d --name mycont -v my-vol:/app nginx:latest | start container with -v flag (volume mount) | 64 | | docker run -d --name devtest --mount source=my-vol,target=/app nginx:latest | start container with --mount flag | 65 | | docker run -d -it --name devtest -v "$(pwd)"/myfolder:/app nginx:latest | start container with bind mounts and -v flag | 66 | | docker run -d -it --name devtest --mount type=bind,source="$(pwd)"/myfolder,target=/app nginx:latest | start container with bind mounts and -mount flag | 67 | 68 | 69 | -------------------------------------------------------------------------------- /005-ubuntu/package-lock.json: -------------------------------------------------------------------------------- 1 | { 2 | "name": "demojsapp", 3 | "version": "1.0.0", 4 | "lockfileVersion": 1, 5 | "requires": true, 6 | "dependencies": { 7 | "accepts": { 8 | "version": "1.3.7", 9 | "resolved": "https://registry.npmjs.org/accepts/-/accepts-1.3.7.tgz", 10 | "integrity": "sha512-Il80Qs2WjYlJIBNzNkK6KYqlVMTbZLXgHx2oT0pU/fjRHyEp+PEfEPY0R3WCwAGVOtauxh1hOxNgIf5bv7dQpA==", 11 | "requires": { 12 | "mime-types": "2.1.24", 13 | "negotiator": "0.6.2" 14 | } 15 | }, 16 | "array-flatten": { 17 | "version": "1.1.1", 18 | "resolved": "https://registry.npmjs.org/array-flatten/-/array-flatten-1.1.1.tgz", 19 | "integrity": "sha1-ml9pkFGx5wczKPKgCJaLZOopVdI=" 20 | }, 21 | "body-parser": { 22 | "version": "1.19.0", 23 | "resolved": "https://registry.npmjs.org/body-parser/-/body-parser-1.19.0.tgz", 24 | "integrity": "sha512-dhEPs72UPbDnAQJ9ZKMNTP6ptJaionhP5cBb541nXPlW60Jepo9RV/a4fX4XWW9CuFNK22krhrj1+rgzifNCsw==", 25 | "requires": { 26 | "bytes": "3.1.0", 27 | "content-type": "1.0.4", 28 | "debug": "2.6.9", 29 | "depd": "1.1.2", 30 | "http-errors": "1.7.2", 31 | "iconv-lite": "0.4.24", 32 | "on-finished": "2.3.0", 33 | "qs": "6.7.0", 34 | "raw-body": "2.4.0", 35 | "type-is": "1.6.18" 36 | } 37 | }, 38 | "bytes": { 39 | "version": "3.1.0", 40 | "resolved": "https://registry.npmjs.org/bytes/-/bytes-3.1.0.tgz", 41 | "integrity": "sha512-zauLjrfCG+xvoyaqLoV8bLVXXNGC4JqlxFCutSDWA6fJrTo2ZuvLYTqZ7aHBLZSMOopbzwv8f+wZcVzfVTI2Dg==" 42 | }, 43 | "content-disposition": { 44 | "version": "0.5.3", 45 | "resolved": "https://registry.npmjs.org/content-disposition/-/content-disposition-0.5.3.tgz", 46 | "integrity": "sha512-ExO0774ikEObIAEV9kDo50o+79VCUdEB6n6lzKgGwupcVeRlhrj3qGAfwq8G6uBJjkqLrhT0qEYFcWng8z1z0g==", 47 | "requires": { 48 | "safe-buffer": "5.1.2" 49 | } 50 | }, 51 | "content-type": { 52 | "version": "1.0.4", 53 | "resolved": "https://registry.npmjs.org/content-type/-/content-type-1.0.4.tgz", 54 | "integrity": "sha512-hIP3EEPs8tB9AT1L+NUqtwOAps4mk2Zob89MWXMHjHWg9milF/j4osnnQLXBCBFBk/tvIG/tUc9mOUJiPBhPXA==" 55 | }, 56 | "cookie": { 57 | "version": "0.4.0", 58 | "resolved": "https://registry.npmjs.org/cookie/-/cookie-0.4.0.tgz", 59 | "integrity": "sha512-+Hp8fLp57wnUSt0tY0tHEXh4voZRDnoIrZPqlo3DPiI4y9lwg/jqx+1Om94/W6ZaPDOUbnjOt/99w66zk+l1Xg==" 60 | }, 61 | "cookie-signature": { 62 | "version": "1.0.6", 63 | "resolved": "https://registry.npmjs.org/cookie-signature/-/cookie-signature-1.0.6.tgz", 64 | "integrity": "sha1-4wOogrNCzD7oylE6eZmXNNqzriw=" 65 | }, 66 | "debug": { 67 | "version": "2.6.9", 68 | "resolved": "https://registry.npmjs.org/debug/-/debug-2.6.9.tgz", 69 | "integrity": "sha512-bC7ElrdJaJnPbAP+1EotYvqZsb3ecl5wi6Bfi6BJTUcNowp6cvspg0jXznRTKDjm/E7AdgFBVeAPVMNcKGsHMA==", 70 | "requires": { 71 | "ms": "2.0.0" 72 | } 73 | }, 74 | "depd": { 75 | "version": "1.1.2", 76 | "resolved": "https://registry.npmjs.org/depd/-/depd-1.1.2.tgz", 77 | "integrity": "sha1-m81S4UwJd2PnSbJ0xDRu0uVgtak=" 78 | }, 79 | "destroy": { 80 | "version": "1.0.4", 81 | "resolved": "https://registry.npmjs.org/destroy/-/destroy-1.0.4.tgz", 82 | "integrity": "sha1-l4hXRCxEdJ5CBmE+N5RiBYJqvYA=" 83 | }, 84 | "ee-first": { 85 | "version": "1.1.1", 86 | "resolved": "https://registry.npmjs.org/ee-first/-/ee-first-1.1.1.tgz", 87 | "integrity": "sha1-WQxhFWsK4vTwJVcyoViyZrxWsh0=" 88 | }, 89 | "encodeurl": { 90 | "version": "1.0.2", 91 | "resolved": "https://registry.npmjs.org/encodeurl/-/encodeurl-1.0.2.tgz", 92 | "integrity": "sha1-rT/0yG7C0CkyL1oCw6mmBslbP1k=" 93 | }, 94 | "escape-html": { 95 | "version": "1.0.3", 96 | "resolved": "https://registry.npmjs.org/escape-html/-/escape-html-1.0.3.tgz", 97 | "integrity": "sha1-Aljq5NPQwJdN4cFpGI7wBR0dGYg=" 98 | }, 99 | "etag": { 100 | "version": "1.8.1", 101 | "resolved": "https://registry.npmjs.org/etag/-/etag-1.8.1.tgz", 102 | "integrity": "sha1-Qa4u62XvpiJorr/qg6x9eSmbCIc=" 103 | }, 104 | "express": { 105 | "version": "4.17.0", 106 | "resolved": "https://registry.npmjs.org/express/-/express-4.17.0.tgz", 107 | "integrity": "sha512-1Z7/t3Z5ZnBG252gKUPyItc4xdeaA0X934ca2ewckAsVsw9EG71i++ZHZPYnus8g/s5Bty8IMpSVEuRkmwwPRQ==", 108 | "requires": { 109 | "accepts": "1.3.7", 110 | "array-flatten": "1.1.1", 111 | "body-parser": "1.19.0", 112 | "content-disposition": "0.5.3", 113 | "content-type": "1.0.4", 114 | "cookie": "0.4.0", 115 | "cookie-signature": "1.0.6", 116 | "debug": "2.6.9", 117 | "depd": "1.1.2", 118 | "encodeurl": "1.0.2", 119 | "escape-html": "1.0.3", 120 | "etag": "1.8.1", 121 | "finalhandler": "1.1.2", 122 | "fresh": "0.5.2", 123 | "merge-descriptors": "1.0.1", 124 | "methods": "1.1.2", 125 | "on-finished": "2.3.0", 126 | "parseurl": "1.3.3", 127 | "path-to-regexp": "0.1.7", 128 | "proxy-addr": "2.0.5", 129 | "qs": "6.7.0", 130 | "range-parser": "1.2.1", 131 | "safe-buffer": "5.1.2", 132 | "send": "0.17.1", 133 | "serve-static": "1.14.1", 134 | "setprototypeof": "1.1.1", 135 | "statuses": "1.5.0", 136 | "type-is": "1.6.18", 137 | "utils-merge": "1.0.1", 138 | "vary": "1.1.2" 139 | } 140 | }, 141 | "finalhandler": { 142 | "version": "1.1.2", 143 | "resolved": "https://registry.npmjs.org/finalhandler/-/finalhandler-1.1.2.tgz", 144 | "integrity": "sha512-aAWcW57uxVNrQZqFXjITpW3sIUQmHGG3qSb9mUah9MgMC4NeWhNOlNjXEYq3HjRAvL6arUviZGGJsBg6z0zsWA==", 145 | "requires": { 146 | "debug": "2.6.9", 147 | "encodeurl": "1.0.2", 148 | "escape-html": "1.0.3", 149 | "on-finished": "2.3.0", 150 | "parseurl": "1.3.3", 151 | "statuses": "1.5.0", 152 | "unpipe": "1.0.0" 153 | } 154 | }, 155 | "forwarded": { 156 | "version": "0.1.2", 157 | "resolved": "https://registry.npmjs.org/forwarded/-/forwarded-0.1.2.tgz", 158 | "integrity": "sha1-mMI9qxF1ZXuMBXPozszZGw/xjIQ=" 159 | }, 160 | "fresh": { 161 | "version": "0.5.2", 162 | "resolved": "https://registry.npmjs.org/fresh/-/fresh-0.5.2.tgz", 163 | "integrity": "sha1-PYyt2Q2XZWn6g1qx+OSyOhBWBac=" 164 | }, 165 | "http-errors": { 166 | "version": "1.7.2", 167 | "resolved": "https://registry.npmjs.org/http-errors/-/http-errors-1.7.2.tgz", 168 | "integrity": "sha512-uUQBt3H/cSIVfch6i1EuPNy/YsRSOUBXTVfZ+yR7Zjez3qjBz6i9+i4zjNaoqcoFVI4lQJ5plg63TvGfRSDCRg==", 169 | "requires": { 170 | "depd": "1.1.2", 171 | "inherits": "2.0.3", 172 | "setprototypeof": "1.1.1", 173 | "statuses": "1.5.0", 174 | "toidentifier": "1.0.0" 175 | } 176 | }, 177 | "iconv-lite": { 178 | "version": "0.4.24", 179 | "resolved": "https://registry.npmjs.org/iconv-lite/-/iconv-lite-0.4.24.tgz", 180 | "integrity": "sha512-v3MXnZAcvnywkTUEZomIActle7RXXeedOR31wwl7VlyoXO4Qi9arvSenNQWne1TcRwhCL1HwLI21bEqdpj8/rA==", 181 | "requires": { 182 | "safer-buffer": "2.1.2" 183 | } 184 | }, 185 | "inherits": { 186 | "version": "2.0.3", 187 | "resolved": "https://registry.npmjs.org/inherits/-/inherits-2.0.3.tgz", 188 | "integrity": "sha1-Yzwsg+PaQqUC9SRmAiSA9CCCYd4=" 189 | }, 190 | "ipaddr.js": { 191 | "version": "1.9.0", 192 | "resolved": "https://registry.npmjs.org/ipaddr.js/-/ipaddr.js-1.9.0.tgz", 193 | "integrity": "sha512-M4Sjn6N/+O6/IXSJseKqHoFc+5FdGJ22sXqnjTpdZweHK64MzEPAyQZyEU3R/KRv2GLoa7nNtg/C2Ev6m7z+eA==" 194 | }, 195 | "media-typer": { 196 | "version": "0.3.0", 197 | "resolved": "https://registry.npmjs.org/media-typer/-/media-typer-0.3.0.tgz", 198 | "integrity": "sha1-hxDXrwqmJvj/+hzgAWhUUmMlV0g=" 199 | }, 200 | "merge-descriptors": { 201 | "version": "1.0.1", 202 | "resolved": "https://registry.npmjs.org/merge-descriptors/-/merge-descriptors-1.0.1.tgz", 203 | "integrity": "sha1-sAqqVW3YtEVoFQ7J0blT8/kMu2E=" 204 | }, 205 | "methods": { 206 | "version": "1.1.2", 207 | "resolved": "https://registry.npmjs.org/methods/-/methods-1.1.2.tgz", 208 | "integrity": "sha1-VSmk1nZUE07cxSZmVoNbD4Ua/O4=" 209 | }, 210 | "mime": { 211 | "version": "1.6.0", 212 | "resolved": "https://registry.npmjs.org/mime/-/mime-1.6.0.tgz", 213 | "integrity": "sha512-x0Vn8spI+wuJ1O6S7gnbaQg8Pxh4NNHb7KSINmEWKiPE4RKOplvijn+NkmYmmRgP68mc70j2EbeTFRsrswaQeg==" 214 | }, 215 | "mime-db": { 216 | "version": "1.40.0", 217 | "resolved": "https://registry.npmjs.org/mime-db/-/mime-db-1.40.0.tgz", 218 | "integrity": "sha512-jYdeOMPy9vnxEqFRRo6ZvTZ8d9oPb+k18PKoYNYUe2stVEBPPwsln/qWzdbmaIvnhZ9v2P+CuecK+fpUfsV2mA==" 219 | }, 220 | "mime-types": { 221 | "version": "2.1.24", 222 | "resolved": "https://registry.npmjs.org/mime-types/-/mime-types-2.1.24.tgz", 223 | "integrity": "sha512-WaFHS3MCl5fapm3oLxU4eYDw77IQM2ACcxQ9RIxfaC3ooc6PFuBMGZZsYpvoXS5D5QTWPieo1jjLdAm3TBP3cQ==", 224 | "requires": { 225 | "mime-db": "1.40.0" 226 | } 227 | }, 228 | "ms": { 229 | "version": "2.0.0", 230 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.0.0.tgz", 231 | "integrity": "sha1-VgiurfwAvmwpAd9fmGF4jeDVl8g=" 232 | }, 233 | "negotiator": { 234 | "version": "0.6.2", 235 | "resolved": "https://registry.npmjs.org/negotiator/-/negotiator-0.6.2.tgz", 236 | "integrity": "sha512-hZXc7K2e+PgeI1eDBe/10Ard4ekbfrrqG8Ep+8Jmf4JID2bNg7NvCPOZN+kfF574pFQI7mum2AUqDidoKqcTOw==" 237 | }, 238 | "on-finished": { 239 | "version": "2.3.0", 240 | "resolved": "https://registry.npmjs.org/on-finished/-/on-finished-2.3.0.tgz", 241 | "integrity": "sha1-IPEzZIGwg811M3mSoWlxqi2QaUc=", 242 | "requires": { 243 | "ee-first": "1.1.1" 244 | } 245 | }, 246 | "parseurl": { 247 | "version": "1.3.3", 248 | "resolved": "https://registry.npmjs.org/parseurl/-/parseurl-1.3.3.tgz", 249 | "integrity": "sha512-CiyeOxFT/JZyN5m0z9PfXw4SCBJ6Sygz1Dpl0wqjlhDEGGBP1GnsUVEL0p63hoG1fcj3fHynXi9NYO4nWOL+qQ==" 250 | }, 251 | "path-to-regexp": { 252 | "version": "0.1.7", 253 | "resolved": "https://registry.npmjs.org/path-to-regexp/-/path-to-regexp-0.1.7.tgz", 254 | "integrity": "sha1-32BBeABfUi8V60SQ5yR6G/qmf4w=" 255 | }, 256 | "proxy-addr": { 257 | "version": "2.0.5", 258 | "resolved": "https://registry.npmjs.org/proxy-addr/-/proxy-addr-2.0.5.tgz", 259 | "integrity": "sha512-t/7RxHXPH6cJtP0pRG6smSr9QJidhB+3kXu0KgXnbGYMgzEnUxRQ4/LDdfOwZEMyIh3/xHb8PX3t+lfL9z+YVQ==", 260 | "requires": { 261 | "forwarded": "0.1.2", 262 | "ipaddr.js": "1.9.0" 263 | } 264 | }, 265 | "qs": { 266 | "version": "6.7.0", 267 | "resolved": "https://registry.npmjs.org/qs/-/qs-6.7.0.tgz", 268 | "integrity": "sha512-VCdBRNFTX1fyE7Nb6FYoURo/SPe62QCaAyzJvUjwRaIsc+NePBEniHlvxFmmX56+HZphIGtV0XeCirBtpDrTyQ==" 269 | }, 270 | "range-parser": { 271 | "version": "1.2.1", 272 | "resolved": "https://registry.npmjs.org/range-parser/-/range-parser-1.2.1.tgz", 273 | "integrity": "sha512-Hrgsx+orqoygnmhFbKaHE6c296J+HTAQXoxEF6gNupROmmGJRoyzfG3ccAveqCBrwr/2yxQ5BVd/GTl5agOwSg==" 274 | }, 275 | "raw-body": { 276 | "version": "2.4.0", 277 | "resolved": "https://registry.npmjs.org/raw-body/-/raw-body-2.4.0.tgz", 278 | "integrity": "sha512-4Oz8DUIwdvoa5qMJelxipzi/iJIi40O5cGV1wNYp5hvZP8ZN0T+jiNkL0QepXs+EsQ9XJ8ipEDoiH70ySUJP3Q==", 279 | "requires": { 280 | "bytes": "3.1.0", 281 | "http-errors": "1.7.2", 282 | "iconv-lite": "0.4.24", 283 | "unpipe": "1.0.0" 284 | } 285 | }, 286 | "safe-buffer": { 287 | "version": "5.1.2", 288 | "resolved": "https://registry.npmjs.org/safe-buffer/-/safe-buffer-5.1.2.tgz", 289 | "integrity": "sha512-Gd2UZBJDkXlY7GbJxfsE8/nvKkUEU1G38c1siN6QP6a9PT9MmHB8GnpscSmMJSoF8LOIrt8ud/wPtojys4G6+g==" 290 | }, 291 | "safer-buffer": { 292 | "version": "2.1.2", 293 | "resolved": "https://registry.npmjs.org/safer-buffer/-/safer-buffer-2.1.2.tgz", 294 | "integrity": "sha512-YZo3K82SD7Riyi0E1EQPojLz7kpepnSQI9IyPbHHg1XXXevb5dJI7tpyN2ADxGcQbHG7vcyRHk0cbwqcQriUtg==" 295 | }, 296 | "send": { 297 | "version": "0.17.1", 298 | "resolved": "https://registry.npmjs.org/send/-/send-0.17.1.tgz", 299 | "integrity": "sha512-BsVKsiGcQMFwT8UxypobUKyv7irCNRHk1T0G680vk88yf6LBByGcZJOTJCrTP2xVN6yI+XjPJcNuE3V4fT9sAg==", 300 | "requires": { 301 | "debug": "2.6.9", 302 | "depd": "1.1.2", 303 | "destroy": "1.0.4", 304 | "encodeurl": "1.0.2", 305 | "escape-html": "1.0.3", 306 | "etag": "1.8.1", 307 | "fresh": "0.5.2", 308 | "http-errors": "1.7.2", 309 | "mime": "1.6.0", 310 | "ms": "2.1.1", 311 | "on-finished": "2.3.0", 312 | "range-parser": "1.2.1", 313 | "statuses": "1.5.0" 314 | }, 315 | "dependencies": { 316 | "ms": { 317 | "version": "2.1.1", 318 | "resolved": "https://registry.npmjs.org/ms/-/ms-2.1.1.tgz", 319 | "integrity": "sha512-tgp+dl5cGk28utYktBsrFqA7HKgrhgPsg6Z/EfhWI4gl1Hwq8B/GmY/0oXZ6nF8hDVesS/FpnYaD/kOWhYQvyg==" 320 | } 321 | } 322 | }, 323 | "serve-static": { 324 | "version": "1.14.1", 325 | "resolved": "https://registry.npmjs.org/serve-static/-/serve-static-1.14.1.tgz", 326 | "integrity": "sha512-JMrvUwE54emCYWlTI+hGrGv5I8dEwmco/00EvkzIIsR7MqrHonbD9pO2MOfFnpFntl7ecpZs+3mW+XbQZu9QCg==", 327 | "requires": { 328 | "encodeurl": "1.0.2", 329 | "escape-html": "1.0.3", 330 | "parseurl": "1.3.3", 331 | "send": "0.17.1" 332 | } 333 | }, 334 | "setprototypeof": { 335 | "version": "1.1.1", 336 | "resolved": "https://registry.npmjs.org/setprototypeof/-/setprototypeof-1.1.1.tgz", 337 | "integrity": "sha512-JvdAWfbXeIGaZ9cILp38HntZSFSo3mWg6xGcJJsd+d4aRMOqauag1C63dJfDw7OaMYwEbHMOxEZ1lqVRYP2OAw==" 338 | }, 339 | "statuses": { 340 | "version": "1.5.0", 341 | "resolved": "https://registry.npmjs.org/statuses/-/statuses-1.5.0.tgz", 342 | "integrity": "sha1-Fhx9rBd2Wf2YEfQ3cfqZOBR4Yow=" 343 | }, 344 | "toidentifier": { 345 | "version": "1.0.0", 346 | "resolved": "https://registry.npmjs.org/toidentifier/-/toidentifier-1.0.0.tgz", 347 | "integrity": "sha512-yaOH/Pk/VEhBWWTlhI+qXxDFXlejDGcQipMlyxda9nthulaxLZUNcUqFxokp0vcYnvteJln5FNQDRrxj3YcbVw==" 348 | }, 349 | "type-is": { 350 | "version": "1.6.18", 351 | "resolved": "https://registry.npmjs.org/type-is/-/type-is-1.6.18.tgz", 352 | "integrity": "sha512-TkRKr9sUTxEH8MdfuCSP7VizJyzRNMjj2J2do2Jr3Kym598JVdEksuzPQCnlFPW4ky9Q+iA+ma9BGm06XQBy8g==", 353 | "requires": { 354 | "media-typer": "0.3.0", 355 | "mime-types": "2.1.24" 356 | } 357 | }, 358 | "unpipe": { 359 | "version": "1.0.0", 360 | "resolved": "https://registry.npmjs.org/unpipe/-/unpipe-1.0.0.tgz", 361 | "integrity": "sha1-sr9O6FFKrmFltIF4KdIbLvSZBOw=" 362 | }, 363 | "utils-merge": { 364 | "version": "1.0.1", 365 | "resolved": "https://registry.npmjs.org/utils-merge/-/utils-merge-1.0.1.tgz", 366 | "integrity": "sha1-n5VxD1CiZ5R7LMwSR0HBAoQn5xM=" 367 | }, 368 | "vary": { 369 | "version": "1.1.2", 370 | "resolved": "https://registry.npmjs.org/vary/-/vary-1.1.2.tgz", 371 | "integrity": "sha1-IpnwLG3tMNSllhsLn3RSShj2NPw=" 372 | } 373 | } 374 | } 375 | --------------------------------------------------------------------------------