├── 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 |
--------------------------------------------------------------------------------