diff --git a/.travis.yml b/.travis.yml
index 2613e65e58437a3b635ae75081c0cc471dc9ad13..f4e9fa43358458b1423b65f3687ce585d114ca2d 100644
--- a/.travis.yml
+++ b/.travis.yml
@@ -1,13 +1,21 @@
 # Config file for automatic testing at travis-ci.org
+dist: xenial
 language: python
 python:
-  - 2.7
   - 3.5
   - 3.6
+  - 3.7
+
+env:
+  - INSTALL_NODE_VERSION=8
+  - INSTALL_NODE_VERSION=10
+  - INSTALL_NODE_VERSION=12
+
 install:
   - pip install cookiecutter
-  - pip install invoke==1.0.0
-  - nvm install 8.11.2
-  - nvm use 8.11.2
+  - pip install invoke==1.2.0
+  - nvm install $INSTALL_NODE_VERSION
+  - nvm use $INSTALL_NODE_VERSION
+
 script:
   - invoke test
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..ba4fdb47b72d1683cdce186d5bebdd2682cad502
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,10 @@
+FROM python:3.7-alpine
+
+RUN apk update \
+    && apk upgrade \
+    && apk add --no-cache git
+
+RUN pip install \
+    cookiecutter==1.6.0
+
+ENTRYPOINT [ "python", "-m", "cookiecutter" ]
diff --git a/README.rst b/README.rst
index ba0de8471844abaa8dc987aa0aa757ed62fd263c..42851ce0a35738821d5e92dec5d78ead2b1470c8 100644
--- a/README.rst
+++ b/README.rst
@@ -16,7 +16,26 @@ A Flask template for cookiecutter_.
 
 Use it now
 ----------
-::
+
+Docker
+******
+
+.. code-block:: bash
+
+   $ ./cookiecutter-docker.sh --help
+        Usage: ./cookiecutter-docker.sh [OPTIONS]
+
+        Options:
+        -b, --build    Build Docker image before running cookiecutter
+        -t, --template Specify custom cookiecutter template via a URI to a git repo
+                       e.g. https://github.com/cookiecutter-flask/cookiecutter-flask.git
+                       Defaults to template in current working directory
+        -h, --help     Show this message and exit
+
+Standard
+********
+
+.. code-block:: bash
 
     $ pip install cookiecutter
     $ cookiecutter https://github.com/cookiecutter-flask/cookiecutter-flask.git
@@ -120,7 +139,7 @@ Changelog
 
 - Update stale requirements.
 - Add CSRF protection.
-- Run ``lint`` commmand on Travis builds.
+- Run ``lint`` command on Travis builds.
 - Test against Python 3.5.
 
 0.8.0 (11/09/2015)
diff --git a/cookiecutter-docker.sh b/cookiecutter-docker.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b223bd4cd3c1c1bbfc343632b27837aaa30ec559
--- /dev/null
+++ b/cookiecutter-docker.sh
@@ -0,0 +1,66 @@
+#!/usr/bin/env bash
+set -e
+
+PROGNAME=$0
+BUILD_IMAGE=false
+COOKIECUTTER_TEMPLATE='.'
+
+
+usage() {
+  cat << EOF >&2
+Usage: $PROGNAME [OPTIONS]
+
+Options:
+-b, --build    Build Docker image before running cookiecutter
+-t, --template Specify custom cookiecutter template via a URI to a git repo
+               e.g. https://github.com/cookiecutter-flask/cookiecutter-flask.git
+               Defaults to template in current working directory
+-h, --help     Show this message and exit
+
+EOF
+    exit 1
+    }
+
+
+process_args() {
+    while test $# -gt 0
+    do
+      case "$1" in
+          -h) usage
+              ;;
+          --help) usage
+              ;;
+          -b) BUILD_IMAGE=true
+              ;;
+          --build) BUILD_IMAGE=true
+              ;;
+          -t) COOKIECUTTER_TEMPLATE="$2"
+              shift
+              ;;
+          --template) COOKIECUTTER_TEMPLATE="$2"
+              shift
+              ;;
+          --*) usage;
+              exit 1;
+              ;;
+          *) usage;
+              exit 1;
+              ;;
+      esac
+      shift
+  done
+}
+
+
+run_cookiecutter() {
+    if [[ "$(docker images -q cookiecutter-docker 2> /dev/null)" == "" ]] || $BUILD_IMAGE ; then
+    docker build . --tag=cookiecutter-docker
+    fi
+
+    docker run -i -t -v ${PWD}:/build -w /build cookiecutter-docker ${COOKIECUTTER_TEMPLATE}
+}
+
+process_args "$@"
+run_cookiecutter
+
+exit 0
diff --git a/cookiecutter.json b/cookiecutter.json
index 600313b3f45a6284e877dec75f9195235caa5e3d..a0da127fc00e103cc6af036bea17b97d0e2c38f6 100644
--- a/cookiecutter.json
+++ b/cookiecutter.json
@@ -7,5 +7,5 @@
 	"project_short_description": "A flasky app.",
 	"use_pipenv": ["no", "yes"],
 	"python_version": ["3.7", "3.6", "3.5"],
-	"node_version": ["12", "11", "10", "8"]
+	"node_version": ["12", "10", "8"]
 }
diff --git a/hooks/post_gen_project.py b/hooks/post_gen_project.py
index 339ecfa655d36107fdbfcb92d616eafaa8262f12..e9645f41ee6d7d16509aef7aa45f908a24db53b0 100644
--- a/hooks/post_gen_project.py
+++ b/hooks/post_gen_project.py
@@ -1,14 +1,14 @@
 #!/usr/bin/env python
 # -*- coding: utf-8 -*-
 """Post gen hook to ensure that the generated project
-hase only one package managment, either pipenv or pip."""
+has only one package management, either pipenv or pip."""
 import os
 import shutil
 import sys
 
 
-def clean_extra_package_managment_files():
-    """Removes either requirements files and folderor the Pipfile."""
+def clean_extra_package_management_files():
+    """Removes either requirements files and folder or the Pipfile."""
     use_pipenv = '{{cookiecutter.use_pipenv}}'
     to_delete = []
 
@@ -32,4 +32,4 @@ def clean_extra_package_managment_files():
 
 
 if __name__ == '__main__':
-    clean_extra_package_managment_files()
+    clean_extra_package_management_files()
diff --git a/hooks/pre_gen_project.py b/hooks/pre_gen_project.py
new file mode 100644
index 0000000000000000000000000000000000000000..d2c4c6991af3e2ef12ccfdbafe4b31444b43b4bf
--- /dev/null
+++ b/hooks/pre_gen_project.py
@@ -0,0 +1,33 @@
+import re
+import sys
+
+
+MODULE_REGEX = r"^[_a-zA-Z][_a-zA-Z0-9]+$"
+
+
+class bcolors:
+    HEADER = "\033[95m"
+    OKBLUE = "\033[94m"
+    OKGREEN = "\033[92m"
+    WARNING = "\033[93m"
+    FAIL = "\033[91m"
+    ENDC = "\033[0m"
+    BOLD = "\033[1m"
+    UNDERLINE = "\033[4m"
+
+
+def validate_python_module_name():
+    module_name = "{{ cookiecutter.app_name }}"
+    if not re.match(MODULE_REGEX, module_name):
+        print(
+            (
+                "\n{0}ERROR:{1} "
+                + "{2}{3}{1} is not a valid Python module name!\n"
+                + "See https://www.python.org/dev/peps/pep-0008/#package-and-module-names for naming standards.\n"
+            ).format(bcolors.WARNING, bcolors.ENDC, bcolors.BOLD, module_name)
+        )
+        sys.exit(1)
+
+
+if __name__ == "__main__":
+    validate_python_module_name()