diff --git a/.dockerignore b/.dockerignore
index 0180602e56fc1598f19f3d799020cd02f3b95c4d..81e8f6d50a13e2d1598ebc5127e8b2b6b90e2c45 100644
--- a/.dockerignore
+++ b/.dockerignore
@@ -2,6 +2,7 @@ Dockerfile
 .travis.yml
 .gitignore
 demo/etc
+synctl
 tox.ini
 .git/*
 .tox/*
diff --git a/docker/Dockerfile b/docker/Dockerfile
index 20d3fe3bd89199e4439a22628b7651eb9010057c..ad0ae0b734eb79bfc4ae206f0751b13be22a1944 100644
--- a/docker/Dockerfile
+++ b/docker/Dockerfile
@@ -1,4 +1,5 @@
-FROM docker.io/python:2-alpine3.8
+ARG PYTHON_VERSION=2
+FROM docker.io/python:${PYTHON_VERSION}-alpine3.8
 
 COPY . /synapse
 
@@ -12,6 +13,7 @@ RUN apk add --no-cache --virtual .build_deps \
         postgresql-dev \
         zlib-dev \
  && cd /synapse \
+ && sed -i 's/\["synctl"\] + //' setup.py \
  && apk add --no-cache --virtual .runtime_deps \
  	libffi \
         libjpeg-turbo \
diff --git a/docker/start.py b/docker/start.py
index 90e8b9c51aa200705c7eabe56794870e897755e3..346df8c87f066c8ec8c407b5b280292f8a464be1 100755
--- a/docker/start.py
+++ b/docker/start.py
@@ -5,6 +5,7 @@ import os
 import sys
 import subprocess
 import glob
+import codecs
 
 # Utility functions
 convert = lambda src, dst, environ: open(dst, "w").write(jinja2.Template(open(src).read()).render(**environ))
@@ -23,7 +24,7 @@ def generate_secrets(environ, secrets):
                 with open(filename) as handle: value = handle.read()
             else:
                 print("Generating a random secret for {}".format(name))
-                value = os.urandom(32).encode("hex")
+                value = codecs.encode(os.urandom(32), "hex").decode()
                 with open(filename, "w") as handle: handle.write(value)
             environ[secret] = value