From 6fb64998cefda4550ac1d26e2fb4827a63ef3d67 Mon Sep 17 00:00:00 2001
From: Lars Eggert <lars@eggert.org>
Date: Wed, 13 Oct 2021 11:33:37 +0000
Subject: [PATCH] Version of the new docker setup emailed out for testing on
 2021-10-12  - Legacy-Id: 19417

---
 docker/Dockerfile     | 226 ++++++++++++-----------------------------
 docker/README.md      |  37 +++++++
 docker/README.rst     |  98 ------------------
 docker/build          |  39 +++-----
 docker/devserver      |  15 ---
 docker/docker-init.sh | 228 +++++++++++-------------------------------
 docker/install-extras |  14 ---
 docker/mailserver     |  13 ---
 docker/run            | 205 ++++---------------------------------
 docker/setprompt      |  26 -----
 docker/setupdb        | 114 ---------------------
 docker/updatedb       |  72 ++++---------
 12 files changed, 211 insertions(+), 876 deletions(-)
 create mode 100644 docker/README.md
 delete mode 100644 docker/README.rst
 delete mode 100755 docker/devserver
 delete mode 100755 docker/install-extras
 delete mode 100755 docker/mailserver
 delete mode 100644 docker/setprompt
 delete mode 100755 docker/setupdb

diff --git a/docker/Dockerfile b/docker/Dockerfile
index f14cb9196..dc7710f4e 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,185 +1,85 @@
-# -*- shell-mode -*-
-# This file is a docker (https://www.docker.com/what-docker) recipe, which can be used to build
-# a docker image which is ready to run a datatracker in development mode.
+# This is a Dockerfile with everything in it to run the IETF datatracker.
 #
-# It is used to build an image (once you've installed docker) using a command like this (assuming
-# suitable replacement of $variables:
+# If you make changes to the datatracker that add new dependencies (python
+# packages or otherwise), you need to rebuild this image to make them
+# available. Do this in the top-level directory of your datatracker source
+# tree:
 #
-#	$ docker build -t $yourdockerid/datatracker:$version
+# docker build --tag dt:latest .
 #
-# To use a pre-built image, assuming we're on OS X and have a checked-out datatracker repository
-# at /Users/$login/src/6.8.1.dev0, you would start (again assuming you've installed docker)
-# a container from an image, as follows:
-# 
-#	$ docker run -ti --name=$containername -v /Users/$login:/home/$login levkowetz/datatracker:$version /bin/bash
-# 
-# This maps your home directory to /home/$login in the container, and starts it running /bin/bash.
-# 
-# In this first version, the docker environment is set up so that tests will run successfully,
-# but the database has *not* been loaded with a dump, and supporting files (drafts, charters, etc.)
-# have *not* been downloaded.
+# You can then execute the datatracker like this (also from the top-level
+# datatracker source directory):
+#
+# docker run -ti -v $(pwd):/root/src dt:latest
 
-FROM dyne/devuan:beowulf
-LABEL maintainer="Henrik Levkowetz <henrik@levkowetz.com>"
+FROM ubuntu:hirsute
+LABEL maintainer="IETF Tools Team <tools-discuss@ietf.org>"
 
 # Default django runserver port
-EXPOSE	8000
+EXPOSE 8000
 
-# Run apt-get noninteractive
+# Default mysqld/mariadb port
+EXPOSE 3306
+
+# Install all dependencies that are available as packages
 ENV DEBIAN_FRONTEND=noninteractive
-ENV DEVUAN_FRONTEND=noninteractive
-
-# Uncomment this to be able to install and run apt-show-versions:
-RUN rm -v /etc/apt/apt.conf.d/docker-compress
-RUN rm -v /var/lib/apt/lists/*lz4
-
-RUN apt-get update --allow-releaseinfo-change
-RUN apt-get install -qy apt-transport-https
-
-# Use backports, updates, and security updates
-RUN echo "deb http://deb.devuan.org/merged beowulf main contrib non-free"  > /etc/apt/sources.list
-RUN echo "deb http://deb.devuan.org/merged beowulf-security main contrib non-free" >> /etc/apt/sources.list
-RUN echo "deb http://deb.devuan.org/merged beowulf-updates main contrib non-free" >> /etc/apt/sources.list
-RUN echo "deb http://deb.devuan.org/merged beowulf-backports main contrib non-free" >> /etc/apt/sources.list
-
-# Remove some excludes for the docker image
-RUN sed -i -e '/^path-exclude=.*\/groff/d' \
-           -e '/^path-exclude=.*\/locale/d' \
-           -e '/^path-exclude=.*\/man/d' /etc/dpkg/dpkg.cfg.d/docker-excludes
-
-# Install needed packages
-#
-# We're not including graphviz and ghostscript, needed for the 3 document
-# dependency graph tests; they would increase the size of the image by about
-# 15%, about 100MB.
-
-# Fetch apt package information, and upgrade to latest package versions
-
-RUN apt-get update
-RUN apt-get -qy upgrade
-
-# Install the packages we need
-RUN apt-get install -qy \
-	build-essential \
-	bzip2 \
-	ca-certificates \
-	colordiff \
-	gawk \
-	gcc \
-	ipython \
-	jq \
-	less \
-	libbz2-dev \
-	libdb5.3-dev \
-	libexpat1-dev \
-	libffi-dev \
-	libgdbm-dev \
-	libjpeg62-turbo-dev \
-	liblzma-dev \
-	libmagic1 \
-	libmariadbclient-dev \
-	libncurses5-dev \
-	libncursesw5-dev \
-	libreadline-dev \
-	libsqlite3-dev \
-	libssl-dev \
-	libsvn1 \
-	libxml2-dev \
-	libxslt-dev \
-	libz-dev \
-	libffi-dev \
-	locales \
-	make \
-	man \
-	mariadb-client \
-	mariadb-server \
-	openssh-client \
-	patch \
-	procps \
-	pv \
-	rsync \
+RUN apt-get -y update && \
+    apt-get -y install --no-install-recommends \
+        apache2-utils \
+        apt-file \
+        apt-utils \
+        chromium-driver \
+        curl \
+        enscript \
+        gcc \
+        ghostscript \
+        git \
+        graphviz \
+        libmagic-dev \
+        libmariadb-dev \
+        mariadb-server \
+        npm \
+        pigz \
+        pv \
+        python-is-python3 \
+        python3-dev \
+        python3-pip \
         rsyslog \
-	subversion \
-	sudo \
-	uuid-dev  \
-	vim \
-	wget \
-	xz-utils\
-	zile \
-	zlib1g-dev
+        unzip \
+        yang-tools && \
+    apt-get -y clean && \
+    rm -rf /var/lib/apt/lists/*
 
-# Postgresql packages
-RUN apt-get install -qy \
-        postgresql-11 \
-        postgresql-server-dev-11 
+# Install bower
+RUN npm install -g bower
 
-# Get the key used to sign the libyang repo
-RUN wget -nv http://download.opensuse.org/repositories/home:liberouter/Debian_9.0/Release.key
-RUN apt-key add - < Release.key
-RUN rm Release.key
-
-# Add apt source entry for libyang
-RUN echo "deb http://download.opensuse.org/repositories/home:/liberouter/Debian_9.0/ /" >> /etc/apt/sources.list.d/libyang.list
-
-# Update the package defs, and install the desired mysql from the mysql repo
-RUN apt-get update
-RUN apt-get install -qy libyang1
-
-# This is expected to exist by the mysql startup scripts:
-#RUN touch /etc/mysql/debian.cnf
-# ------------------------------------------------------------------------------
-
-# Get rid of installation files we don't need in the image, to reduce size
-RUN apt-get clean && rm -rf /var/lib/apt/lists/*
-
-# Enable some common locales
-RUN sed -i -e 's/^. en_US/en_US/' -e 's/^. en_GB/en_GB/' -e 's/^. en_IE/en_IE/' /etc/locale.gen
-RUN locale-gen
-
-# Remove an rsyslog module that we don't need, which also requires extra permissions
-RUN sed -i -e '/load="imklog"/d' /etc/rsyslog.conf
-
-# Set up root password
-RUN echo "root:root" | chpasswd
-
-# MySQL
-VOLUME /var/lib/mysql
-
-# idnits and dependencies
+# Install idnits
 ADD https://tools.ietf.org/tools/idnits/idnits /usr/local/bin/
 RUN chmod +rx /usr/local/bin/idnits
 
-# Directory for Mac certs
-RUN mkdir /etc/certificates
+# Install current datatracker python dependencies
+COPY requirements.txt /
+RUN pip install -r /requirements.txt
 
-# # Python 3
-# # Comment in if OS does not provide python3.6, which is the current
-# # production version
-ENV PYVER=3.6.10
-ENV PYREV=3.6
+# Turn off rsyslog kernel logging (doesn't work in Docker)
+RUN sed -i '/imklog/s/^/#/' /etc/rsyslog.conf
 
-WORKDIR /usr/src
-RUN wget -q https://www.python.org/ftp/python/$PYVER/Python-$PYVER.tar.xz
-RUN tar xJf Python-$PYVER.tar.xz
-RUN rm Python-$PYVER.tar.xz
-WORKDIR /usr/src/Python-$PYVER/
-RUN ./configure
-RUN make
-RUN make altinstall
-WORKDIR /usr/src
-RUN rm -rf /usr/src/Python-$PYVER/
+# Allow access to mariadb over the network
+RUN sed -i 's/127.0.0.1/0.0.0.0/' /etc/mysql/mariadb.conf.d/50-server.cnf
 
-ENV HOSTNAME="datatracker"
+# Turn on mariadb performance_schema
+RUN sed -i 's/\[mysqld\]/\[mysqld\]\nperformance_schema=ON/' /etc/mysql/mariadb.conf.d/50-server.cnf
 
-ENV DDIR="/usr/local/share/datatracker"
-RUN mkdir -p $DDIR
-WORKDIR $DDIR
-
-COPY requirements.txt ./
-COPY setprompt ./
+# Make the mariadb sys schema available for possible installation
+# We would normally use the next line, but that has a bug:
+# ADD https://github.com/FromDual/mariadb-sys/archive/master.zip /
+# This is the repo that has the PR:
+ADD https://github.com/grooverdan/mariadb-sys/archive/refs/heads/master.zip /
+RUN unzip /master.zip
 
+# Copy the startup file
 COPY docker-init.sh /docker-init.sh
 RUN chmod +x /docker-init.sh
-ENTRYPOINT ["/docker-init.sh"]
 
-CMD	/bin/bash
+WORKDIR /root/src
+ENTRYPOINT ["/docker-init.sh"]
\ No newline at end of file
diff --git a/docker/README.md b/docker/README.md
new file mode 100644
index 000000000..e30940efa
--- /dev/null
+++ b/docker/README.md
@@ -0,0 +1,37 @@
+# Datatracker Development in Docker
+
+1. [Set up Docker](https://docs.docker.com/get-started/) on your preferred
+   platform.
+
+2. If you have a copy of the datatracker code checked out already, simply `cd`
+   to the top-level directory.
+
+   If not, check out a datatracker branch as usual. We'll check out `trunk`
+   below, but you can use any branch:
+
+       svn co https://svn.ietf.org/svn/tools/ietfdb/trunk
+       cd trunk
+
+3. **TEMPORARY:** Replace the contents of the `docker` directory with Lars'
+   files.
+
+4. **TEMPORARY:** Until Lars' changes have been merged and a docker image is
+   available for download, you will need to build it locally:
+
+       docker/build -l
+
+    This will take a while, but only needs to be done once.
+
+5. Use the `docker/run` script to start the datatracker container. You will be
+   dropped into a shell from which you can start the datatracker and execute
+   related commands as usual, for example:
+
+       ietf/manage.py runserver 0.0.0.0:8000
+
+   If you do not already have a copy of the IETF database available in the
+   `data` directory, one will be downloaded and imported the first time you run
+   `docker/run`. This will take some time.
+
+   Once the datatracker has started, you should be able to open
+   [http://localhost:8000](http://localhost:8000) in a browser and see the
+   landing page.
\ No newline at end of file
diff --git a/docker/README.rst b/docker/README.rst
deleted file mode 100644
index d79777e36..000000000
--- a/docker/README.rst
+++ /dev/null
@@ -1,98 +0,0 @@
-
-==============================================================================
-	     Datatracker Development in a Docker Container (beta)
-==============================================================================
-
-
-Intro
-=====
-
-Docker_ is a toolkit which lets you package software together with its
-dependencies in lightweight containers, and run it in isolated virtual
-environments.
-
-During and just after IETF-94 I've spent quite a bit of time setting up a
-docker image which provides the dependencies needed to run the datatracker,
-and it's now available for beta testing.  Hopefully this should make it
-substantially easier to get started with datatracker development.
-
-Steps
-=====
-
-1. Set up Docker on your preferred platform.  Official installers exist for
-   many Linux flavours, OS X, Windows and Cloud services.  Here's the full `List
-   of Installation Instructions`_.
-
-   Docker containers require the services of an underlying Linux API, which
-   means that on OS X and Windows, these have to be provided by a virtual
-   machine which runs a minimal Linux image.  The virtual machine used on
-   non-Linux platforms is commonly VirtualBox.  On Linux kernels with version
-   3.8 or later, no virtual machine is needed, as the docker images can be
-   fully supported with the native kernel services.
-
-   Please follow the Docker installations all the way through to successfully
-   running the ``hello-world`` example in a terminal window ( ``$ docker run
-   hello-world``).
-
-
-2. Check out your datatracker branch as usual, in a suitable directory.
-   We'll assume ``~/src/dt/`` here, and assume you are ``'coder'``::
-
-      ~/src/dt/ $ svn co https://svn.tools.ietf.org/svn/tools/ietfdb/personal/coder/6.8.2.dev0
-
-3. In the checked-out working copy, you'll find a ``docker/`` directory and a
-   ``data/`` directory at the top level.  We're first going to set up a copy of
-   the MySQL database files under the ``data/`` directory.
-
-   There is a command in the ``docker/`` directory, ``setupdb`` which will do
-   this for you, or you can do it manually.
-
-   Either run::
-
-      ~/src/dt/6.8.2.dev0/ $ docker/setupdb
-
-   or do this step-by-step: fetch down a pre-built copy of the datatracker
-   database, place it in the ``data`` directory, unpack it, and fix
-   permissions::
-
-      ~/src/dt/6.8.2.dev0/ $ cd data
-      ~/src/dt/6.8.2.dev0/data/ $ wget https://www.ietf.org/lib/dt/sprint/ietf_utf8.bin.tar.bz2
-      ~/src/dt/6.8.2.dev0/data/ $ tar xjf ietf_utf8.bin.tar.bz2
-      ~/src/dt/6.8.2.dev0/data/ $ chmod -R go+rwX mysql
-
-
-4. In the ``docker/`` directory you'll also find a wrapper script named
-   ``'run'``.  We will be using the wrapper to run a pre-built docker image
-   fetched from the docker hub::
-
-      ~/src/dt/6.8.2.dev0/ $ docker/run
-
-   This will pull down the latest docker ietf/datatracker-environment image,
-   start it up with appropriate settings, map the internal ``/var/lib/mysql/``
-   directory to the external ``data/mysql/`` directory where we placed the
-   database, set up a python virtualenv for you, install some dependencies,
-   and drop you in a bash shell where you can run the datatracker.
-
-6. You are now ready to run the tests::
-
-      (virtual) $ ietf/manage.py test --settings=settings_sqlitetest
-
-   and then start the dev server::
-
-      (virtual) $ ietf/manage.py runserver 0.0.0.0:8000
-
-   Note the IP address ``0.0.0.0`` used to make the dev server bind to all
-   addresses.  The internal port 8000 has been mapped to port 8000 externally,
-   too.  In order to find the IP address of the VirtualBox, run ``'$
-   docker-machine ip'`` *outside* the virtual environment::
-
-      ~/src/dt/6.8.2.dev0/ $ docker-machine ip
-      192.168.59.103
-
-      ~/src/dt/6.8.2.dev0/ $ open http://192.168.59.103:8000/
-
-..  _Docker: https://www.docker.com/
-..  _`List of Installation Instructions`: https://docs.docker.com/v1.8/installation/
-..  _VirtualBox: https://www.virtualbox.org/
-
-
diff --git a/docker/build b/docker/build
index eb3d66f20..2a9c4df63 100755
--- a/docker/build
+++ b/docker/build
@@ -1,11 +1,11 @@
 #!/bin/bash
 
-version=0.10
+version=0.11
 program=${0##*/}
 progdir=${0%/*}
 if [ "$progdir" = "$program" ]; then progdir="."; fi
 if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
+parent=$(dirname "$progdir")
 if [ "$parent" = "." ]; then parent="$PWD"; fi
 
 export LANG=C
@@ -31,10 +31,10 @@ DESCRIPTION
 
 EOF
     echo -e "OPTIONS"
-    if   [ "$(uname)" = "Linux" ]; then
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
+    if   [ "$(uname)" = "Linux" ] || [ "$(uname)" = "Darwin" ]; then
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
     else
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
     fi
     cat <<EOF
 
@@ -48,7 +48,7 @@ COPYRIGHT
 	Copyright (c) 2016 IETF Trust and the persons identified as authors of
 	the code. All rights reserved.  License 'Simplified BSD', as specified
 	in http://opensource.org/licenses/BSD-3-Clause.
-	
+
 EOF
 
 }
@@ -59,10 +59,6 @@ function die() {
     exit 1
 }
 
-function note() { 
-	if [ -n "$VERBOSE" ]; then echo -e "$*"; fi
-}
-
 # ----------------------------------------------------------------------
 function version() {
 	echo -e "$program $version"
@@ -77,24 +73,22 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)";
 
 # Options
 shortopts=hlt:vV
-longopts=help,local,tag=,verbose,version
+longopts=help,local,tag=,version
 
 # Default values
-BRANCH=$(svn log -v ^/tags -l 2 | grep 'A /tags/[1-9]' | awk '{print $2}')
-TAG=${BRANCH##*/}
+IMAGE=ietf/datatracker-environment
+TAG=$(basename "$(svn info "$parent" | grep ^URL | awk '{print $2}')")
 LOCAL=""
 
 if   [ "$(uname)" = "Linux" ]; then
     args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@")
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     eval set -- "$args"
-    sed="sed -r"
 else
     # Darwin, BSDs
     args=$(getopt -o$shortopts $SV $*)
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     set -- $args
-    sed="sed -E"
 fi
 
 while true ; do
@@ -102,7 +96,6 @@ while true ; do
 	-h| --help)	usage; exit;;		# Show this help, then exit
 	-l| --local)	LOCAL=1;;		# Don't upload
 	-t| --tag)	TAG=$2; shift;;		# Use this docker image tag, instead of the latest svn tags name
-	-v| --verbose)	VERBOSE=1;;		# Be more talkative
 	-V| --version)	version; exit;;		# Show program version, then exit
 	--)		shift; break;;
 	*) die "Internal error, inconsistent option specification: '$1'";;
@@ -113,14 +106,10 @@ done
 # ----------------------------------------------------------------------
 # The program itself
 
-if [ "$(uname)" == "Linux" ]; then
-    die "Didn't expect to run this script on Linux -- are you inside docker?"
-fi
-
-docker rmi -f ietf/datatracker-environment:trunk || true
-docker build -t ietf/datatracker-environment:$TAG docker/
-docker tag $(docker images -q ietf/datatracker-environment | head -n 1) ietf/datatracker-environment:latest
+docker rmi -f $IMAGE:trunk 2>/dev/null || true
+docker build --progress plain -t "$IMAGE:$TAG" docker/
+docker tag "$(docker images -q $IMAGE | head -n 1)" $IMAGE:latest
 if [ -z "$LOCAL" ]; then
-    docker push ietf/datatracker-environment:latest
-    docker push ietf/datatracker-environment:$TAG
+    docker push $IMAGE:latest
+    docker push "$IMAGE:$TAG"
 fi
\ No newline at end of file
diff --git a/docker/devserver b/docker/devserver
deleted file mode 100755
index add4534fa..000000000
--- a/docker/devserver
+++ /dev/null
@@ -1,15 +0,0 @@
-#!/bin/bash
-
-version=0.10
-program=${0##*/}
-progdir=${0%/*}
-if [ "$progdir" = "$program" ]; then progdir="."; fi
-if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
-if [ "$parent" = "." ]; then parent="$PWD"; fi
-
-# ----------------------------------------------------------------------
-
-$progdir/run ietf/manage.py runserver 0.0.0.0:8000
-
-
diff --git a/docker/docker-init.sh b/docker/docker-init.sh
index de1c0a651..fdc0003a6 100644
--- a/docker/docker-init.sh
+++ b/docker/docker-init.sh
@@ -1,195 +1,85 @@
 #!/bin/bash
 
-# A little bit of setup
-export LANG=en_GB.UTF-8
+MYSQLDIR=/var/lib/mysql
 
-echo "Gathering info ..."
-MYSQLDIR="$(mysqld --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
-if [ ! "$USER" ]; then
-    echo "Environment variable USER is not set -- will set USER='django'."
-    USER="django"
-fi
-if [ ! "$UID" ]; then
-    echo "Environment variable UID is not set -- will set UID='1000'."
-    UID="1000"
-fi
-if [ ! "$GID" ]; then
-    echo "Environment variable GID is not set -- will set GID='1000'."
-    GID="1000"
-fi
-if [ ! "$TAG" ]; then
-    echo "Environment variable TAG is not set -- will set TAG='datatracker'."
-    TAG="datatracker"
-fi
-echo "User $USER ($UID:$GID)"
-
-echo "Checking if MySQL base data exists ..."
-if [ ! -d $MYSQLDIR/mysql ]; then
-    echo "WARNING: Expected the directory $MYSQLDIR/mysql/ to exist -- have you downloaded and unpacked the IETF binary database tarball?"
+if [ ! -d "$MYSQLDIR" ]; then
+    echo "WARNING: Expected the directory $MYSQLDIR to exist."
+    exit 1
 fi
 
-echo "Setting up the 'mysql' user for database file access ..."
-MYSQL_TARGET_GID=$(stat -c "%g" $MYSQLDIR/mysql)
-if ! grep -q ":$MYSQL_TARGET_GID:$" /etc/group; then
-    groupadd -g $MYSQL_TARGET_GID mysqldata
-fi
-usermod -a -G $MYSQL_TARGET_GID mysql
+service rsyslog start
 
-echo "Checking if MySQL is running ..."
-if ! /etc/init.d/mysql status; then
-    echo "Starting mysql ..."
-    /etc/init.d/mysql start
+if [ -z "$(ls -A $MYSQLDIR/mysql 2>/dev/null)" ]; then
+    echo "WARNING: Database seems to be empty."
+    mysql_install_db > /dev/null || exit 1
 fi
 
-echo "Checking if syslogd is running ..."
-if ! /etc/init.d/rsyslog status > /dev/null; then
-    echo "Starting syslogd ..."
-    /etc/init.d/rsyslog start
+service mariadb start
+
+if ! service mariadb status; then
+    echo "ERROR: MySQL isn't running."
+    grep mysqld /var/log/syslog
+    exit 1
 fi
 
-# Give debian-sys-maint access, to avoid complaints later
-mysql mysql <<< "GRANT ALL PRIVILEGES on *.* TO 'debian-sys-maint'@'localhost' IDENTIFIED BY '$(awk '/^password/ {print $3; exit}' /etc/mysql/debian.cnf )' WITH GRANT OPTION; FLUSH PRIVILEGES;"
-
-echo "Checking if the IETF database exists at $MYSQLDIR ..."
 if [ ! -d $MYSQLDIR/ietf_utf8 ]; then
-    if [ -z "$DATADIR" ]; then
-	echo "DATADIR is not set, but the IETF database needs to be set up -- can't continue, exiting the docker init script."
-	exit 1
-    fi
-    ls -l $MYSQLDIR
-
-    if ! /etc/init.d/mysql status; then
-	echo "Didn't find the IETF database, but can't set it up either, as MySQL isn't running."
-    else
-	echo "Creating database ..."
-	mysqladmin -u root --default-character-set=utf8 create ietf_utf8
-
-	echo "Setting up permissions ..."
-	mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON ietf_utf8.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;"
-
-	echo "Fetching database ..."       
-	DUMPDIR=/home/$USER/$DATADIR
-	wget -N -P $DUMPDIR http://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz
-
-	echo "Loading database ..."
-	gunzip < $DUMPDIR/ietf_utf8.sql.gz \
-	    | pv --progress --bytes --rate --eta --cursor --size $(gzip --list --quiet $DUMPDIR/ietf_utf8.sql.gz | awk '{ print $2 }') \
-	    | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \
-	    | mysql --user=django --password=RkTkDPFnKpko -s -f ietf_utf8 \
-	    && rm /tmp/ietf_utf8.sql.gz
-    fi
+    echo "WARNING: IETF database seems to be missing; populating it from dump."
+    mysqladmin -u root --default-character-set=utf8 create ietf_utf8
+    pushd /mariadb-sys-master || exit
+    mysql -u root < sys_10.sql
+    popd || exit
+    mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON *.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;"
+    /root/src/docker/updatedb
 fi
 
-if ! grep -q ":$GID:$" /etc/group ; then
-    echo "Creating group entry for GID '$GID' ..."
-    groupadd -g "$GID" "$USER"
-fi
-if ! id -u "$USER" &> /dev/null; then
-    echo "Creating user '$USER' ..."
-    useradd -s /bin/bash --groups staff,sudo --uid $UID --gid $GID $USER
-    echo "$USER:$USER" | chpasswd
-fi
-
-VIRTDIR="/opt/home/$USER/$TAG"
-echo "Checking that there's a virtual environment for $TAG ..."
-if [ ! -f $VIRTDIR/bin/activate ]; then
-    echo "Setting up python virtualenv at $VIRTDIR ..."
-    mkdir -p $VIRTDIR
-    python3.6 -m venv $VIRTDIR
-    echo -e "
-# This is from $VIRTDIR/bin/activate, to activate the
-# datatracker virtual python environment on docker container entry:
-" >> /etc/bash.bashrc
-    cat $VIRTDIR/bin/activate >> /etc/bash.bashrc
-    cat /usr/local/share/datatracker/setprompt >> /etc/bash.bashrc 
-else
-    echo "Using virtual environment at $VIRTDIR"
-fi
-
-echo "Activating the virtual python environment ..."
-. $VIRTDIR/bin/activate
-
-
-if ! $VIRTDIR/bin/python -c "import django"; then
-    echo "Installing requirements ..."
-    pip install --upgrade pip
-    reqs=/home/$USER/$CWD/requirements.txt
-    if [ ! -f $reqs ]; then
-        echo "   Using $reqs"
-        pip install -r $reqs
-    else
-        echo "   Didn't find $reqs"
-        echo "   Using /usr/local/share/datatracker/requirements.txt"
-        pip install -r /usr/local/share/datatracker/requirements.txt
-    fi
-fi
-
-if [ ! -f /home/$USER/$CWD/ietf/settings_local.py ]; then
-    echo "Setting up a default settings_local.py ..."
-    cp /home/$USER/$CWD/docker/settings_local.py /home/$USER/$CWD/ietf/settings_local.py
-fi
-
-for sub in test/id/ test/staging/ test/archive/ test/rfc test/media test/wiki/ietf; do
-    dir="/home/$USER/$CWD/$sub"
-    if [ ! -d "$dir"  ]; then
-	echo "Creating dir $dir"
-	mkdir -p "$dir";
-    fi
-done
-
 for sub in					\
-	nomcom_keys/public_keys			\
-	developers/ietf-ftp			\
-	developers/ietf-ftp/bofreq		\
-	developers/ietf-ftp/charter		\
-	developers/ietf-ftp/conflict-reviews	\
-	developers/ietf-ftp/internet-drafts	\
-	developers/ietf-ftp/rfc			\
-	developers/ietf-ftp/status-changes	\
-	developers/ietf-ftp/yang/catalogmod	\
-	developers/ietf-ftp/yang/draftmod	\
-	developers/ietf-ftp/yang/ianamod	\
-	developers/ietf-ftp/yang/invalmod	\
-	developers/ietf-ftp/yang/rfcmod		\
-	developers/www6s			\
-	developers/www6s/staging		\
-	developers/www6s/wg-descriptions	\
-	developers/www6s/proceedings		\
-	developers/www6/			\
-	developers/www6/iesg			\
-	developers/www6/iesg/evaluation		\
+    test/id \
+    test/staging \
+    test/archive \
+    test/rfc \
+    test/media \
+    test/wiki/ietf \
+	data/nomcom_keys/public_keys			\
+	data/developers/ietf-ftp			\
+	data/developers/ietf-ftp/bofreq		\
+	data/developers/ietf-ftp/charter		\
+	data/developers/ietf-ftp/conflict-reviews	\
+	data/developers/ietf-ftp/internet-drafts	\
+	data/developers/ietf-ftp/rfc			\
+	data/developers/ietf-ftp/status-changes	\
+	data/developers/ietf-ftp/yang/catalogmod	\
+	data/developers/ietf-ftp/yang/draftmod	\
+	data/developers/ietf-ftp/yang/ianamod	\
+	data/developers/ietf-ftp/yang/invalmod	\
+	data/developers/ietf-ftp/yang/rfcmod		\
+	data/developers/www6s			\
+	data/developers/www6s/staging		\
+	data/developers/www6s/wg-descriptions	\
+	data/developers/www6s/proceedings		\
+	data/developers/www6/			\
+	data/developers/www6/iesg			\
+	data/developers/www6/iesg/evaluation		\
 	; do
-    dir="/home/$USER/$CWD/data/$sub"
+    dir="/root/src/$sub"
     if [ ! -d "$dir"  ]; then
-	echo "Creating dir $dir"
+    	echo "Creating dir $dir"
 	mkdir -p "$dir";
-	chown "$USER" "$dir"
     fi
 done
 
-if [ ! -f "/home/$USER/$CWD/test/data/draft-aliases" ]; then
-    echo "Generating draft aliases ..."
-    ietf/bin/generate-draft-aliases }
+if [ ! -f /root/src/ietf/settings_local.py ]; then
+    echo "Setting up a default settings_local.py ..."
+    cp /root/src/docker/settings_local.py /root/src/ietf/settings_local.py
 fi
 
-if [ ! -f "/home/$USER/$CWD/test/data/group-aliases" ]; then
-    echo "Generating group aliases ..."
-    ietf/bin/generate-wg-aliases }
-fi
+python -m smtpd -n -c DebuggingServer localhost:2025 &
+echo
 
-chown -R $USER /opt/home/$USER
-chmod -R g+w   /usr/local/lib/		# so we can patch libs if needed
-
-cd "/home/$USER/$CWD" || cd "/home/$USER/"
-
-echo "Done!"
-if ! echo "$LANG" | grep "UTF-8"; then
-    echo ""
-    echo "Make sure you export LANG=en_GB.UTF-8 (or another UTF-8 locale) in your .bashrc"
+if [ -z "$*" ]; then
+    bash
 else
-    echo "LANG=$LANG"
+    bash -c "$*"
 fi
 
-HOME=/opt/home/$USER
-
-su -p $USER
+service mariadb stop
+service rsyslog stop
\ No newline at end of file
diff --git a/docker/install-extras b/docker/install-extras
deleted file mode 100755
index 6c8e700dc..000000000
--- a/docker/install-extras
+++ /dev/null
@@ -1,14 +0,0 @@
-#!/bin/bash
-
-export DEBIAN_FRONTEND=noninteractive
-sudo su - -c "apt-get update \
-	&& apt-get install -qy \
-                apt-file \
-                apt-show-versions \
-                graphviz \
-                ghostscript \
-                apache2-utils \
-                chromium-driver \
-                enscript \
-	&& apt-get clean \
-	&& rm -rf /var/lib/apt/lists/*"
diff --git a/docker/mailserver b/docker/mailserver
deleted file mode 100755
index b4d8af9e7..000000000
--- a/docker/mailserver
+++ /dev/null
@@ -1,13 +0,0 @@
-#!/bin/bash
-
-version=0.10
-program=${0##*/}
-progdir=${0%/*}
-if [ "$progdir" = "$program" ]; then progdir="."; fi
-if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
-if [ "$parent" = "." ]; then parent="$PWD"; fi
-
-# ----------------------------------------------------------------------
-
-$progdir/run python -m smtpd -n -c DebuggingServer localhost:2025
diff --git a/docker/run b/docker/run
index 96d92dfec..a24993598 100755
--- a/docker/run
+++ b/docker/run
@@ -1,13 +1,13 @@
 #!/bin/bash
 
-version=0.10
+version=0.20
 program=${0##*/}
 progdir=${0%/*}
 if [ "$progdir" = "$program" ]; then progdir="."; fi
 if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
+parent=$(dirname "$progdir")
 if [ "$parent" = "." ]; then parent="$PWD"; fi
-if [[ $(uname) =~ CYGWIN.* ]]; then parent=$(echo $parent | sed -e 's/^\/cygdrive\/\(.\)/\1:/'); fi
+if [[ $(uname) =~ CYGWIN.* ]]; then parent=$(echo "$parent" | sed -e 's/^\/cygdrive\/\(.\)/\1:/'); fi
 
 # ----------------------------------------------------------------------
 function usage() {
@@ -30,10 +30,10 @@ DESCRIPTION
 
 EOF
     echo -e "OPTIONS"
-    if   [ "$(uname)" = "Linux" ]; then
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
+    if   [ "$(uname)" = "Linux" ] || [ "$(uname)" = "Darwin" ]; then
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
     else
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
     fi
     cat <<EOF
 
@@ -47,7 +47,7 @@ COPYRIGHT
 	Copyright (c) 2015 IETF Trust and the persons identified as authors of
 	the code. All rights reserved.  License 'Simplified BSD', as specified
 	in http://opensource.org/licenses/BSD-3-Clause.
-	
+
 EOF
 
 }
@@ -58,10 +58,6 @@ function die() {
     exit 1
 }
 
-function note() { 
-	if [ -n "$VERBOSE" ]; then echo -e "$*"; fi
-}
-
 # ----------------------------------------------------------------------
 function version() {
 	echo -e "$program $version"
@@ -75,48 +71,32 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)";
 # Option parsing
 
 # Options
-shortopts=dhi:m:Mp:r:t:vVu:cC
-longopts=download-data,help,ietfdb-url=,mysqldata=,no-mysqldir,port=,docker-repo=,tag=,verbose,version,user=,cached,no-cached
+shortopts=hp:vVcC
+longopts=help,port=,version,cached,no-cached
 
 # Default values
 MYSQLDIR=$parent/data/mysql
-FILEDIR=$parent/../data/
 PORT=8000
 REPO="ietf/datatracker-environment"
-DBURL=https://www.ietf.org/lib/dt/sprint/ietf_utf8.bin.tar.bz2
-WHO=$(whoami)
-CACHED=''
+CACHED=':cached'
 
 if   [ "$(uname)" = "Linux" ]; then
     args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@")
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     eval set -- "$args"
-    sed="sed -r"
 else
     # Darwin, BSDs
     args=$(getopt -o$shortopts $SV $*)
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     set -- $args
-    sed="sed -E"
-    if [ "$(uname)" = "Darwin" ]; then
-	CACHED=':cached'
-    fi
 fi
 
 while true ; do
     case "$1" in
 	-c| --cached)	CACHED=':cached';;	# Use cached disk access to reduce system load
-	-C| --no-cached)	CACHED='';;	# Use fully synchronized disk access
-	-d| --download-data) DOWNLOAD=1;;	# Download and set up the database files
+	-C| --no-cached)	CACHED=':consistent';;	# Use fully synchronized disk access
 	-h| --help)	usage; exit;;		# Show this help, then exit
-	-f| --filedir)	FILEDIR=$2; shift;;	# Set the desired location of drafts, charters etc.
-	-i| --ietfdb-url)	DBURL=$2; shift;;	# Use an alternative database tarball URL
-	-m| --mysqldir)	MYSQLDIR=$2; shift;;	# Set the desired location of MySQL's database files
 	-p| --port)	PORT=$2; shift;;	# Bind the container's port 8000 to external port PORT
-	-r| --docker-repo)	REPO=$2; shift;;	# Use the given docker repository, instead of the default
-	-t| --tag)	TAG=$2; shift;;		# Use this docker image tag, instead of the svn branch name
-	-u| --user)	WHO=$2; shift;;		# Run the container as the specified user
-	-v| --verbose)	VERBOSE=1;;		# Be more talkative
 	-V| --version)	version; exit;;		# Show program version, then exit
 	--)		shift; break;;
 	*) die "Internal error, inconsistent option specification: '$1'";;
@@ -125,163 +105,14 @@ while true ; do
 done
 
 if [ -z "$TAG" ]; then
-  TAG=$(basename $(svn info $parent | grep ^URL | awk '{print $2}'))
+  TAG=$(basename "$(svn info "$parent" | grep ^URL | awk '{print $2}')")
 fi
 
 # ----------------------------------------------------------------------
-# The program itself
 
-[ -f /proc/1/cgroups ] && grep 'docker' /proc/1/cgroups && die "It looks like you're inside docker already ..."
-
-if   [ "$(uname)" = "Darwin" ]; then
-    APP="/Applications/Docker.app"
-    CMD="open -a"
-elif [ "$(uname)" = "Linux" ]; then
-    echo "Running on Linux."
-elif [[ $(uname) =~ CYGWIN.* ]]; then
-    echo "Running under Cygwin."
-    CMD="echo"
-    MYSQLDIR=$(echo $MYSQLDIR | sed -e 's/^\/cygdrive\/\(.\)/\1:/')
-    WHO=$(echo $WHO | sed -e 's/^.*\\//' | tr -d \\r)
-    DRIVE=$(echo $USERPROFILE | sed -e 's/\(.\).*/\1/' -e 'y/ABCDEFGHIJKLMNOPQRSTUVWXYZ/abcdefdhijklmnopqartuvwxyz/')
-    HOME=$DRIVE$(echo $USERPROFILE | sed -e 's/\\/\//g' -e's/.\(.*\)/\1/')
-    echo "Using home dir $HOME"
-    PWD=$(echo $PWD | sed -e 's/^\/cygdrive\/\(.\)/\1:/')
-    if [ "${PWD#$HOME}" = "$PWD" ]; then
-        die "You must work inside your home directory ($HOME)"
-    fi
-    CGWPARENT=$(echo $parent | sed -e 's/^\(.\)\:/\/cygdrive\/\1/')
-    ICSFILES=$(/usr/bin/find $CGWPARENT/vzic/zoneinfo/ -name '*.ics' -print)
-    for ICSFILE in $ICSFILES
-    do
-        LINK=$(head -n1 $ICSFILE | sed -e '/link .*/!d' -e 's/link \(.*\)/\1/')
-        if [ "$LINK" ]; then
-            WDIR=$(dirname $ICSFILE)
-            echo "Replacing $(basename $ICSFILE) with $LINK"
-            cp -f $WDIR/$LINK $ICSFILE
-        fi
-    done
-else
-    die "This script does not have support for your architecture ($(uname)); sorry :-("
-fi
-
-WHOUID=$(id -u $WHO)
-WHOGID=$(id -g $WHO)
-
-if   [ "$(uname)" = "Linux" ]; then
-    echo "Not trying to start a virtual docker machine on Linux"
-elif [[ $(uname) =~ CYGWIN.* ]]; then
-    if ! docker info 1> /dev/null 2>&1; then
-	    echo -e "The docker VM doesn't seem to be running; docker info gave:\n  $info"
-        die "Don't know how to start docker when running under Cygwin"
-    fi
-    TAG=$(echo $TAG | tr -d \\r)
-    URL="http://localhost:$PORT/"
-elif [ -e "$APP" ]; then
-    info=$(docker info 2>&1 || true)
-    if ! docker info 1> /dev/null 2>&1; then
-	echo -e "The docker VM doesn't seem to be running; docker info gave:\n  $info"
-	echo "Will attempt to start docker by doing '\$ $CMD $APP':"
-	$CMD $APP
-	declare -i count
-	printf "Waiting for docker engine .."
-	while true; do
-	    printf "."
-	    sleep 2
-	    if docker info >/dev/null 2>&1; then break; fi
-	    count=$(( $count + 1))
-	    if [ $count -gt 10 ]; then
-		die "No contact with docker engine; bailing out."
-	    fi
-	done
-    fi
-    URL="http://localhost:$PORT/"
-else
-    if [ $($machine status default | tr "A-Z" "a-z" ) != "running" ]; then
-	echo "The docker VM doesn't seem to be running; will attempt to start it by doing '\$ $machine start':"
-	$machine start || die "Failed taking up the Docker VM"
-    fi
-
-    if [ -f "$machine" ]; then
-	if [ $($machine status default | tr "A-Z" "a-z") = "running" ]; then
-	    tmpfile=$(mktemp docker.run.XXXXXXXX)
-	    if $machine env 2>/dev/null | grep  DOCKER_ > $tmpfile; then
-		mv $tmpfile ~/.docker-info
-	    elif printenv | grep  DOCKER_ > $tmpfile; then
-		mv $tmpfile ~/.docker-info
-	    else
-		rm $tmpfile
-		die "Failed setting the appropriate DOCKER_* environment variables."
-	    fi
-	    . ~/.docker-info
-	else
-	    rm -f ~/.docker-info
-	fi
-	ip=$($machine ip)
-	URL="http://$ip:$PORT/"
-    fi
-fi
-
-image=$(docker ps | grep "$REPO:$TAG" | awk '{ print $1 }')
-if [ "$image" ]; then
-    if [ "$*" ]; then
-        echo "Running 'cd ~/${parent#$HOME/}; $*'"
-	docker exec -u "$WHO" -t $image bash -i -c "cd; cd \"${parent#$HOME/}\"; $*"
-    else
-	docker exec -u "$WHO" -ti $image bash -i
-    fi
-else
-    echo ""
-    echo "Starting a docker container for '$TAG'."
-
-    if [ -n "$DOWNLOAD" ]; then
-	(
-	    cd "$(dirname $MYSQLDIR)"
-	    wget -N "$DBURL" && tar xjf ietf_utf8.bin.tar.bz2 && chmod -R go+rwX mysql
-	)
-	[ -d "$MYSQLDIR" ] || die "The download seems to have failed; still no $MYSQLDIR.  Giving up."
-    else
-	[ -d "$MYSQLDIR" ] || die "Expected $MYSQLDIR to exist, but it\ndidn't.  Use '$program -d' to download and unpack the database."
-    fi
-
-    if ! docker images "$REPO" | grep -q "$TAG"; then
-	echo "Fetching docker image '$REPO:$TAG'"
-	if ! docker pull "$REPO:$TAG"; then
-	    docker pull "$REPO:latest" || die "Failed to pull down the '$REPO:latest' docker image"
-	    id=$(docker images "$REPO" | grep latest  | awk '{print $3}')
-	    echo "Tagging $REPO:latest as $REPO:$TAG for use as environment for this branch."
-	    docker tag $id "$REPO:$TAG"
-	fi
-    fi
-
-    echo -e "\nThe web interface for 'runserver' should appear on $URL\n"
-    echo -e "User $WHO ($WHOUID:$WHOGID)"
-    if [ -z "$MYSQLDIR" ]; then
-	docker run -ti -p $PORT:8000 -v "$HOME:/home/$WHO$CACHED"                       \
-	    -e USER="$WHO" -e DATADIR="${parent#$HOME/}/data" -e CWD="${PWD#$HOME/}"	\
-	    -e TAG="$TAG" -e FILEDIR=${FILEDIR#$HOME} -e UID="$WHOUID" -e GID="$WHOGID"	\
-	    "$REPO:$TAG" "$@"
-    else
-	docker run -ti -p $PORT:8000 -v "$HOME:/home/$WHO$CACHED"                       \
-	    -v "$MYSQLDIR:/var/lib/mysql" -e USER="$WHO"                                \
-	    -e DATADIR="${parent#$HOME/}/data" -e CWD="${PWD#$HOME/}" -e TAG="$TAG"     \
-	    -e FILEDIR=${FILEDIR#$HOME} -e UID="$WHOUID" -e GID="$WHOGID"               \
-	    "$REPO:$TAG" "$@"
-    fi
-
-    echo ""
-    echo "Committing changes in the container to an image:"
-    image=$( docker images -q $REPO:$TAG)
-    latest=$(docker ps -lq -f "ancestor=$image")
-    docker commit $latest $REPO:$TAG
-
-    echo ""
-    echo "Cleaning up containers and images"
-    docker rm $latest
-    DANGLING=$( docker images -f dangling=true -q )
-    if [ -n "$DANGLING" ]; then
-	echo "Dangling images: $DANGLING"
-	docker rmi -f $DANGLING
-    fi
-
-fi
+echo "Starting a docker container for '$REPO:$TAG'."
+mkdir -p "$MYSQLDIR"
+docker run -ti -p "$PORT":8000 -p 33306:3306 \
+    -v "$parent:/root/src$CACHED" \
+    -v "$MYSQLDIR:/var/lib/mysql:delegated" \
+    "$REPO:$TAG" "$@"
\ No newline at end of file
diff --git a/docker/setprompt b/docker/setprompt
deleted file mode 100644
index 62ce46000..000000000
--- a/docker/setprompt
+++ /dev/null
@@ -1,26 +0,0 @@
-
-# set a fancy prompt
-PS_TIME="\A "
-
-if [ "$(whoami)" = "root" ]; then
-    PS_COLOUR='\[\033[1;31m\]'
-    PS_END="\[\033[m\]"
-else
-    PS_COLOUR="\[\033[1;34m\]"
-    PS_END="\[\033[m\]"
-fi
-
-if   [ "$TERM" = xterm ]; then
-    PS_XTERM="\[\033]0;\]\h:\w\007"
-else
-    PS_XTERM=""
-fi
-COLOUR_RED='\[\033[1;31m\]'
-COLOUR_BLK='\[\033[1;30m\]'
-if [ "$SHLVL" -gt 1 ]; then
-    PS_SHLVL="$(eval "printf '>%.0s' {2..$SHLVL}") "
-else
-    PS_SHLVL=""
-fi
-
-PS1="$PS_XTERM\n$COLOUR_RED$PS_SHLVL$PS_COLOUR$PS_TIME$COLOUR_RED$PS_COLOUR${VIRTUAL_ENV:+$COLOUR_RED($(basename $VIRTUAL_ENV))$PS_COLOUR }\w\n\u @ $COLOUR_BLK\h$PS_COLOUR \\$ $PS_END"
diff --git a/docker/setupdb b/docker/setupdb
deleted file mode 100755
index 9d517d044..000000000
--- a/docker/setupdb
+++ /dev/null
@@ -1,114 +0,0 @@
-#!/bin/bash
-
-version=0.10
-program=${0##*/}
-progdir=${0%/*}
-if [ "$progdir" = "$program" ]; then progdir="."; fi
-if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
-if [ "$parent" = "." ]; then parent="$PWD"; fi
-
-# ----------------------------------------------------------------------
-function usage() {
-    cat <<EOF
-NAME
-	$program - Set up a local copy of the IETF database MySQL files
-
-SYNOPSIS
-	$program [OPTIONS] ARGS
-
-DESCRIPTION
-
-	This script downloads a prebuilt copy of the IETF database MySQL
-	files, ready for mapping into the /var/lib/mysql/ directory of the
-	ietf/database-environment Docker image.
-
-EOF
-    echo -e "OPTIONS"
-    if   [ "$(uname)" = "Linux" ]; then
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
-    else
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
-    fi
-    cat <<EOF
-
-FILES
-
-AUTHOR
-	Written by Henrik Levkowetz, <henrik@levkowetz.com>
-
-COPYRIGHT
-
-	Copyright (c) 2015 IETF Trust and the persons identified as authors of
-	the code. All rights reserved.  License 'Simplified BSD', as specified
-	in http://opensource.org/licenses/BSD-3-Clause.
-	
-EOF
-
-}
-
-# ----------------------------------------------------------------------
-function die() {
-    echo -e "\n$program: error: $*" >&2 
-    exit 1
-}
-
-function note() { 
-	if [ -n "$VERBOSE" ]; then echo -e "$*"; fi
-}
-
-# ----------------------------------------------------------------------
-function version() {
-	echo -e "$program $version"
-}
-
-# ----------------------------------------------------------------------
-trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)"; exit 1' ERR
-
-
-# ----------------------------------------------------------------------
-# Option parsing
-
-# Options
-shortopts=hvV
-longopts=help,verbose,version
-
-if   [ "$(uname)" = "Linux" ]; then
-    args=$(getopt -o "$shortopts" --long "$longopts" -n '$program' -- $SV "$@")
-    if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
-    eval set -- "$args"
-    sed="sed -r"
-else
-    # Darwin, BSDs
-    args=$(getopt -o$shortopts $SV $*)
-    if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
-    set -- $args
-    sed="sed -E"
-fi
-
-while true ; do
-    case "$1" in
-	-h| --help)	usage; exit;;		# Show this help, then exit
-	-v| --verbose)	VERBOSE=1;;		# Be more talkative
-	-V| --version)	version; exit;;		# Show program version, then exit
-	--)		shift; break;;
-	*) die "Internal error, inconsistent option specification: '$1'";;
-    esac
-    shift
-done
-
-# ----------------------------------------------------------------------
-# The program itself
-
-[ -n "$MYSQLDIR" ]	|| MYSQLDIR=$parent/data/mysql
-[ -n "$URL" ]		|| URL=rsync.ietf.org::dev.db/ietf_utf8.bin.tar.bz2
-
-cd $(dirname $MYSQLDIR)
-echo "Downloading a MySQL database image ..."
-set $(rsync --version | head -n1 | awk '{print $3}' | tr '.' ' ')
-maj=$1; min=$2; fix=$3
-if [ "$maj" -ge "3" -a "$min" -ge "1" ]; then
-    rsync --info=progress2 $URL ./ && echo -e "\nUnpacking database ..." && tar xjf ietf_utf8.bin.tar.bz2 && echo "Fixing permissions ..." && chmod -R go+rwX mysql
-else
-    rsync -v $URL ./ && echo -e "\nUnpacking database ..." && tar xjf ietf_utf8.bin.tar.bz2 && echo "Fixing permissions ..." && chmod -R go+rwX mysql
-fi
diff --git a/docker/updatedb b/docker/updatedb
index 595f3f73d..b1fda05b5 100755
--- a/docker/updatedb
+++ b/docker/updatedb
@@ -1,12 +1,12 @@
 #!/bin/bash
 # -*- indent-with-tabs: 1 -*-
 
-version=0.10
+version=0.20
 program=${0##*/}
 progdir=${0%/*}
 if [ "$progdir" = "$program" ]; then progdir="."; fi
 if [ "$progdir" = "." ]; then progdir="$PWD"; fi
-parent=$(dirname $progdir)
+parent=$(dirname "$progdir")
 if [ "$parent" = "." ]; then parent="$PWD"; fi
 
 # ----------------------------------------------------------------------
@@ -26,9 +26,9 @@ DESCRIPTION
 EOF
     echo -e "OPTIONS"
     if   [ "$(uname)" = "Linux" ]; then
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | tr -s "\t|" "\t," | sed -r -e 's/\)[ \t]+([A-Z]+)=\$2[^#]*#/=\1\t/' -e 's/\)[^#]*#/\t/'
     else
-        egrep "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" $0 | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
+        grep -E "^[	]+[-][A-Za-z| -]+\*?\)[	]+[A-Za-z].+#" "$0" | sed 's/\|.*\$2[^#]*#/	/'| sed -E 's/\|.*\)[^#]*#/	/'
     fi
     cat <<EOF
 
@@ -42,21 +42,17 @@ COPYRIGHT
 	Copyright (c) 2015 IETF Trust and the persons identified as authors of
 	the code. All rights reserved.  License 'Simplified BSD', as specified
 	in http://opensource.org/licenses/BSD-3-Clause.
-	
+
 EOF
 
 }
 
 # ----------------------------------------------------------------------
 function die() {
-    echo -e "\n$program: error: $*" >&2 
+    echo -e "\n$program: error: $*" >&2
     exit 1
 }
 
-function note() { 
-	if [ -n "$VERBOSE" ]; then echo -e "$*"; fi
-}
-
 # ----------------------------------------------------------------------
 function version() {
 	echo -e "$program $version"
@@ -71,24 +67,21 @@ trap 'echo "$program($LINENO): Command failed with error code $? ([$$] $0 $*)";
 
 # Options
 shortopts=DLZhqvV
-longopts=no-download,no-load,no-zap,help,quiet,verbose,version
+longopts=no-download,no-load,no-zap,help,version
 
 LOAD=1
 DOWNLOAD=1
 DROP=1
-QUIET=""
 
 if   [ "$(uname)" = "Linux" ]; then
     args=$(getopt -o "$shortopts" --long "$longopts" -n "$program" -- $SV "$@")
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     eval set -- "$args"
-    sed="sed -r"
 else
     # Darwin, BSDs
     args=$(getopt -o$shortopts $SV $*)
     if [ $? != 0 ] ; then die "Terminating..." >&2 ; exit 1 ; fi
     set -- $args
-    sed="sed -E"
 fi
 
 while true ; do
@@ -97,8 +90,6 @@ while true ; do
 	-L| --no-load)	LOAD=""; ;;		#	Don't load the database
 	-Z| --no-zap)	DROP="";;		#	Don't drop new tables
 	-h| --help)	usage; exit;;		#	Show this help, then exit
-	-q| --quiet)	QUIET="-q";;		#	Don't show progress
-	-v| --verbose)	VERBOSE=1;;		#	Be more talkative
 	-V| --version)	version; exit;;		#	Show program version, then exit
 	--)		shift; break;;
 	*) die "Internal error, inconsistent option specification: '$1'";;
@@ -109,50 +100,27 @@ done
 # ----------------------------------------------------------------------
 # The program itself
 
-echo "Gathering info ..."
-MYSQLDIR="$(/usr/sbin/mysqld --verbose --help 2>/dev/null | awk '$1 == "datadir" { print $2; exit }')"
-MYSQLDIR=${MYSQLDIR%/}
 DATADIR=$parent/data
 
-# echo "Checking if MySQL base data exists ..."
-# if [ ! -d $MYSQLDIR/mysql ]; then
-#     die "Expected the directory $MYSQLDIR/mysql/ to exist -- have you downloaded and unpacked the IETF binary database tarball?"
-# fi
-
-
-# echo "Checking if the IETF database exists at $MYSQLDIR ..."
-# if [ ! -d $MYSQLDIR/ietf_utf8 ]; then
-# 	echo "Creating database ..."
-# 	mysqladmin -u root --default-character-set=utf8 create ietf_utf8
-# 
-# 	echo "Setting up permissions ..."
-# 	mysql -u root ietf_utf8 <<< "GRANT ALL PRIVILEGES ON ietf_utf8.* TO django@localhost IDENTIFIED BY 'RkTkDPFnKpko'; FLUSH PRIVILEGES;"
-# fi
-
+DUMP=ietf_utf8.sql.gz
 if [ "$DOWNLOAD" ]; then
-    echo "Fetching database dump ..."
-    wget $QUIET -N -P $DATADIR https://www.ietf.org/lib/dt/sprint/ietf_utf8.sql.gz || die "No new data, quitting."
+    echo "Fetching database dump..."
+    rsync --info=progress2 rsync.ietf.org::dev.db/$DUMP "$DATADIR"
 fi
 
 if [ "$LOAD" ]; then
-    echo "Loading database ..."
-    if [ -z "$QUIET" ]; then
-        gunzip < $DATADIR/ietf_utf8.sql.gz \
-            | pv --progress --bytes --rate --eta --size $(gzip --list --quiet $DATADIR/ietf_utf8.sql.gz | awk '{ print $2 }') \
-            | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \
-            | $parent/ietf/manage.py dbshell
-    else
-        gunzip < $DATADIR/ietf_utf8.sql.gz \
-            | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \
-            | $parent/ietf/manage.py dbshell
-    fi
-
+    echo "Loading database..."
+    SIZE=$(pigz --list "$DATADIR/$DUMP" | tail -n 1 | awk '{ print $2 }')
+    pigz -d < "$DATADIR/$DUMP" \
+        | pv --progress --bytes --rate --eta --size "$SIZE" \
+        | sed -e 's/ENGINE=MyISAM/ENGINE=InnoDB/' \
+        | "$parent/ietf/manage.py" dbshell
 fi
 
 if [ "$DROP" ]; then
-    echo "Dropping tables not in the dump (so migrations can succeed) ..."
-    diff <(zcat $DATADIR/ietf_utf8.sql.gz | grep '^DROP TABLE IF EXISTS' | tr -d '`;' | awk '{ print $5 }') \
-         <($parent/ietf/manage.py dbshell <<< 'show tables;' | tail -n +2) \
+    echo "Dropping tables not in the dump (so migrations can succeed)..."
+    diff <(pigz -d -c "$DATADIR/$DUMP" | grep '^DROP TABLE IF EXISTS' | tr -d '`;' | awk '{ print $5 }') \
+         <("$parent/ietf/manage.py" dbshell <<< 'show tables;' | tail -n +2) \
 	   | grep '^>' | awk '{print "drop table if exists", $2, ";";}' \
-           | tee >(cat >&2) | $parent/ietf/manage.py dbshell
+           | tee >(cat >&2) | "$parent/ietf/manage.py" dbshell
 fi
\ No newline at end of file