diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 7046f3115839982e25e479347ef7bbf2f7ee9f19..4a8a764f616e5c688df253a32b8f468daf54cf60 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,7 +4,7 @@ before_script:
 build-master:
   stage: build
   script:
-    - docker build --pull -t $CI_REGISTRY_IMAGE .
-    - docker push $CI_REGISTRY_IMAGE
+    - docker build --pull -t $CI_REGISTRY_IMAGE:php-7.0 ./php-7.0
+    - docker push $CI_REGISTRY_IMAGE:php-7.0
   only:
     - master
diff --git a/php-7.0/Dockerfile b/php-7.0/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..9b1b32331566d4a4a2a616c766764bdb19aca9fa
--- /dev/null
+++ b/php-7.0/Dockerfile
@@ -0,0 +1,109 @@
+FROM alpine:3.5
+
+LABEL com.example.vendor="LakeDrops" \
+      maintainer="juergen.haas@lakedrops.com" \
+      version="1.2.1" \
+      description="An image for GitLab runner to build and test Drupal projects."
+
+ARG compose_version=1.21.2
+ARG glibc_version=2.28-r0
+
+RUN apk add --no-cache \
+		ca-certificates
+
+# set up nsswitch.conf for Go's "netgo" implementation (which Docker explicitly uses)
+# - https://github.com/docker/docker-ce/blob/v17.09.0-ce/components/engine/hack/make.sh#L149
+# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275
+# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf
+RUN [ ! -e /etc/nsswitch.conf ] && echo 'hosts: files dns' > /etc/nsswitch.conf
+
+ENV DOCKER_CHANNEL stable
+ENV DOCKER_VERSION 18.06.1-ce
+# TODO ENV DOCKER_SHA256
+# https://github.com/docker/docker-ce/blob/5b073ee2cf564edee5adca05eee574142f7627bb/components/packaging/static/hash_files !!
+# (no SHA file artifacts on download.docker.com yet as of 2017-06-07 though)
+
+RUN set -eux; \
+	\
+# this "case" statement is generated via "update.sh"
+	apkArch="$(apk --print-arch)"; \
+	case "$apkArch" in \
+		x86_64) dockerArch='x86_64' ;; \
+		armhf) dockerArch='armel' ;; \
+		aarch64) dockerArch='aarch64' ;; \
+		ppc64le) dockerArch='ppc64le' ;; \
+		s390x) dockerArch='s390x' ;; \
+		*) echo >&2 "error: unsupported architecture ($apkArch)"; exit 1 ;;\
+	esac; \
+	\
+	apk add --no-cache \
+  		ca-certificates \
+  		curl \
+      openssl; \
+	\
+	if ! curl -fSL "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/${dockerArch}/docker-${DOCKER_VERSION}.tgz" -o docker.tgz; then \
+		echo >&2 "error: failed to download 'docker-${DOCKER_VERSION}' from '${DOCKER_CHANNEL}' for '${dockerArch}'"; \
+		exit 1; \
+	fi; \
+	\
+	tar --extract \
+		--file docker.tgz \
+		--strip-components 1 \
+		--directory /usr/local/bin/ \
+	; \
+	rm docker.tgz; \
+	\
+	dockerd --version; \
+	docker --version
+
+COPY modprobe.sh /usr/local/bin/modprobe
+COPY docker-entrypoint.sh /usr/local/bin/
+COPY drush.sh /usr/local/bin/drush
+
+ENTRYPOINT ["docker-entrypoint.sh"]
+CMD ["sh"]
+
+RUN mkdir -p /root/.ssh && \
+    echo "StrictHostKeyChecking no" >> /root/.ssh/config && \
+    \
+    apk update && \
+    apk add --no-cache curl openssl openssh ca-certificates wget make patch \
+        bash fish python nodejs git unzip \
+        php7 php7-phar php7-json php7-dom php7-gd php7-mbstring php7-openssl \
+        php7-pdo php7-curl php7-xml php7-zip php7-session php7-ctype && \
+    echo "php7-tokenizer php7-simplexml php7-xmlwriter" && \
+    \
+    wget -q https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -O /etc/apk/keys/sgerrand.rsa.pub && \
+    wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${glibc_version}/glibc-${glibc_version}.apk && \
+    apk add --no-cache glibc-${glibc_version}.apk && \
+    rm glibc-${glibc_version}.apk && \
+    ln -s /lib/libz.so.1 /usr/glibc-compat/lib/ && \
+    ln -s /lib/libc.musl-x86_64.so.1 /usr/glibc-compat/lib && \
+    ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1 && \
+    ln -s /lib/libgcc_s.so.1 /usr/glibc-compat/lib/ && \
+    \
+    ln -s /usr/bin/php7 /usr/local/bin/php && \
+    \
+    wget -q https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bin-`uname -s`-amd64 -O /usr/local/bin/ahoy && \
+    chmod +x /usr/local/bin/ahoy && \
+    \
+    wget -q https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose && \
+    chmod +x /usr/local/bin/docker-compose && \
+    \
+    wget -q https://getcomposer.org/composer.phar -O /usr/local/bin/composer && \
+    chmod +x /usr/local/bin/composer && \
+    composer selfupdate && \
+    \
+    git clone https://github.com/tj/git-extras.git && \
+    cd git-extras && \
+    git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) && \
+    make install && \
+    cd .. && \
+    rm -rf git-extras && \
+    \
+    composer global require "hirak/prestissimo:^0.3" && \
+    \
+    ln -s /usr/local/bin/ahoy /usr/local/bin/a && \
+    ln -s /usr/local/bin/composer /usr/local/bin/c && \
+    ln -s /usr/local/bin/docker-compose /usr/local/bin/d-c && \
+    ln -s /usr/local/bin/drush /usr/local/bin/d
diff --git a/docker-entrypoint.sh b/php-7.0/docker-entrypoint.sh
similarity index 100%
rename from docker-entrypoint.sh
rename to php-7.0/docker-entrypoint.sh
diff --git a/drush.sh b/php-7.0/drush.sh
similarity index 100%
rename from drush.sh
rename to php-7.0/drush.sh
diff --git a/modprobe.sh b/php-7.0/modprobe.sh
similarity index 100%
rename from modprobe.sh
rename to php-7.0/modprobe.sh
diff --git a/Dockerfile b/php-7.1/Dockerfile
similarity index 100%
rename from Dockerfile
rename to php-7.1/Dockerfile
diff --git a/php-7.1/docker-entrypoint.sh b/php-7.1/docker-entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9c6fa052d82519ded4e230c689cf5cc8a99ab58a
--- /dev/null
+++ b/php-7.1/docker-entrypoint.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+set -e
+
+# first arg is `-f` or `--some-option`
+if [ "${1#-}" != "$1" ]; then
+	set -- docker "$@"
+fi
+
+# if our command is a valid Docker subcommand, let's invoke it through Docker instead
+# (this allows for "docker run docker ps", etc)
+if docker help "$1" > /dev/null 2>&1; then
+	set -- docker "$@"
+fi
+
+# if we have "--link some-docker:docker" and not DOCKER_HOST, let's set DOCKER_HOST automatically
+if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then
+	export DOCKER_HOST='tcp://docker:2375'
+fi
+
+if [ "$1" = 'dockerd' ]; then
+	cat >&2 <<-'EOW'
+		📎 Hey there!  It looks like you're trying to run a Docker daemon.
+		   You probably should use the "dind" image variant instead, something like:
+		     docker run --privileged --name some-overlay-docker -d docker:stable-dind --storage-driver=overlay
+		   See https://hub.docker.com/_/docker/ for more documentation and usage examples.
+	EOW
+	sleep 3
+fi
+
+exec "$@"
diff --git a/php-7.1/drush.sh b/php-7.1/drush.sh
new file mode 100755
index 0000000000000000000000000000000000000000..33bc00ebc729b0668d5e1e31ddc83ecd739b67b8
--- /dev/null
+++ b/php-7.1/drush.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+docker-compose exec --user root php drush $@
diff --git a/php-7.1/modprobe.sh b/php-7.1/modprobe.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b357d893fda288e5ca49d29c4c5646726bd0eab1
--- /dev/null
+++ b/php-7.1/modprobe.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+set -eu
+
+# "modprobe" without modprobe
+# https://twitter.com/lucabruno/status/902934379835662336
+
+# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe
+
+# Docker often uses "modprobe -va foo bar baz"
+# so we ignore modules that start with "-"
+for module; do
+	if [ "${module#-}" = "$module" ]; then
+		ip link show "$module" || true
+		lsmod | grep "$module" || true
+	fi
+done
+
+# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort
+export PATH='/usr/sbin:/usr/bin:/sbin:/bin'
+exec modprobe "$@"
diff --git a/php-7.2/Dockerfile b/php-7.2/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..d264b8bdc654e391dd430d5d664204a90a86ad5b
--- /dev/null
+++ b/php-7.2/Dockerfile
@@ -0,0 +1,104 @@
+FROM alpine:3.8
+
+LABEL com.example.vendor="LakeDrops" \
+      maintainer="juergen.haas@lakedrops.com" \
+      version="1.2.1" \
+      description="An image for GitLab runner to build and test Drupal projects."
+
+ARG compose_version=1.21.2
+ARG glibc_version=2.28-r0
+
+RUN apk add --no-cache \
+		ca-certificates
+
+# set up nsswitch.conf for Go's "netgo" implementation (which Docker explicitly uses)
+# - https://github.com/docker/docker-ce/blob/v17.09.0-ce/components/engine/hack/make.sh#L149
+# - https://github.com/golang/go/blob/go1.9.1/src/net/conf.go#L194-L275
+# - docker run --rm debian:stretch grep '^hosts:' /etc/nsswitch.conf
+RUN [ ! -e /etc/nsswitch.conf ] && echo 'hosts: files dns' > /etc/nsswitch.conf
+
+ENV DOCKER_CHANNEL stable
+ENV DOCKER_VERSION 18.06.1-ce
+# TODO ENV DOCKER_SHA256
+# https://github.com/docker/docker-ce/blob/5b073ee2cf564edee5adca05eee574142f7627bb/components/packaging/static/hash_files !!
+# (no SHA file artifacts on download.docker.com yet as of 2017-06-07 though)
+
+RUN set -eux; \
+	\
+# this "case" statement is generated via "update.sh"
+	apkArch="$(apk --print-arch)"; \
+	case "$apkArch" in \
+		x86_64) dockerArch='x86_64' ;; \
+		armhf) dockerArch='armel' ;; \
+		aarch64) dockerArch='aarch64' ;; \
+		ppc64le) dockerArch='ppc64le' ;; \
+		s390x) dockerArch='s390x' ;; \
+		*) echo >&2 "error: unsupported architecture ($apkArch)"; exit 1 ;;\
+	esac; \
+	\
+	if ! wget -O docker.tgz "https://download.docker.com/linux/static/${DOCKER_CHANNEL}/${dockerArch}/docker-${DOCKER_VERSION}.tgz"; then \
+		echo >&2 "error: failed to download 'docker-${DOCKER_VERSION}' from '${DOCKER_CHANNEL}' for '${dockerArch}'"; \
+		exit 1; \
+	fi; \
+	\
+	tar --extract \
+		--file docker.tgz \
+		--strip-components 1 \
+		--directory /usr/local/bin/ \
+	; \
+	rm docker.tgz; \
+	\
+	dockerd --version; \
+	docker --version
+
+COPY modprobe.sh /usr/local/bin/modprobe
+COPY docker-entrypoint.sh /usr/local/bin/
+COPY drush.sh /usr/local/bin/drush
+
+ENTRYPOINT ["docker-entrypoint.sh"]
+CMD ["sh"]
+
+RUN mkdir -p /root/.ssh && \
+    echo "StrictHostKeyChecking no" >> /root/.ssh/config && \
+    \
+    apk update && \
+    apk add --no-cache curl openssl openssh ca-certificates wget make patch \
+        bash fish python nodejs npm git unzip \
+        php7 php7-phar php7-json php7-dom php7-gd php7-mbstring php7-openssl \
+        php7-pdo php7-curl php7-xml php7-zip php7-session php7-ctype \
+        php7-tokenizer php7-simplexml php7-xmlwriter && \
+    \
+    wget -q https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub -O /etc/apk/keys/sgerrand.rsa.pub && \
+    wget -q https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${glibc_version}/glibc-${glibc_version}.apk && \
+    apk add --no-cache glibc-${glibc_version}.apk && \
+    rm glibc-${glibc_version}.apk && \
+    ln -s /lib/libz.so.1 /usr/glibc-compat/lib/ && \
+    ln -s /lib/libc.musl-x86_64.so.1 /usr/glibc-compat/lib && \
+    ln -s /usr/lib/libgcc_s.so.1 /lib/libgcc_s.so.1 && \
+    ln -s /lib/libgcc_s.so.1 /usr/glibc-compat/lib/ && \
+    \
+    ln -s /usr/bin/php7 /usr/local/bin/php && \
+    \
+    wget -q https://github.com/ahoy-cli/ahoy/releases/download/2.0.0/ahoy-bin-`uname -s`-amd64 -O /usr/local/bin/ahoy && \
+    chmod +x /usr/local/bin/ahoy && \
+    \
+    wget -q https://github.com/docker/compose/releases/download/${compose_version}/docker-compose-`uname -s`-`uname -m` -O /usr/local/bin/docker-compose && \
+    chmod +x /usr/local/bin/docker-compose && \
+    \
+    wget -q https://getcomposer.org/composer.phar -O /usr/local/bin/composer && \
+    chmod +x /usr/local/bin/composer && \
+    composer selfupdate && \
+    \
+    git clone https://github.com/tj/git-extras.git && \
+    cd git-extras && \
+    git checkout $(git describe --tags $(git rev-list --tags --max-count=1)) && \
+    make install && \
+    cd .. && \
+    rm -rf git-extras && \
+    \
+    composer global require "hirak/prestissimo:^0.3" && \
+    \
+    ln -s /usr/local/bin/ahoy /usr/local/bin/a && \
+    ln -s /usr/local/bin/composer /usr/local/bin/c && \
+    ln -s /usr/local/bin/docker-compose /usr/local/bin/d-c && \
+    ln -s /usr/local/bin/drush /usr/local/bin/d
diff --git a/php-7.2/docker-entrypoint.sh b/php-7.2/docker-entrypoint.sh
new file mode 100755
index 0000000000000000000000000000000000000000..9c6fa052d82519ded4e230c689cf5cc8a99ab58a
--- /dev/null
+++ b/php-7.2/docker-entrypoint.sh
@@ -0,0 +1,30 @@
+#!/bin/sh
+set -e
+
+# first arg is `-f` or `--some-option`
+if [ "${1#-}" != "$1" ]; then
+	set -- docker "$@"
+fi
+
+# if our command is a valid Docker subcommand, let's invoke it through Docker instead
+# (this allows for "docker run docker ps", etc)
+if docker help "$1" > /dev/null 2>&1; then
+	set -- docker "$@"
+fi
+
+# if we have "--link some-docker:docker" and not DOCKER_HOST, let's set DOCKER_HOST automatically
+if [ -z "$DOCKER_HOST" -a "$DOCKER_PORT_2375_TCP" ]; then
+	export DOCKER_HOST='tcp://docker:2375'
+fi
+
+if [ "$1" = 'dockerd' ]; then
+	cat >&2 <<-'EOW'
+		📎 Hey there!  It looks like you're trying to run a Docker daemon.
+		   You probably should use the "dind" image variant instead, something like:
+		     docker run --privileged --name some-overlay-docker -d docker:stable-dind --storage-driver=overlay
+		   See https://hub.docker.com/_/docker/ for more documentation and usage examples.
+	EOW
+	sleep 3
+fi
+
+exec "$@"
diff --git a/php-7.2/drush.sh b/php-7.2/drush.sh
new file mode 100755
index 0000000000000000000000000000000000000000..33bc00ebc729b0668d5e1e31ddc83ecd739b67b8
--- /dev/null
+++ b/php-7.2/drush.sh
@@ -0,0 +1,3 @@
+#!/bin/sh
+
+docker-compose exec --user root php drush $@
diff --git a/php-7.2/modprobe.sh b/php-7.2/modprobe.sh
new file mode 100755
index 0000000000000000000000000000000000000000..b357d893fda288e5ca49d29c4c5646726bd0eab1
--- /dev/null
+++ b/php-7.2/modprobe.sh
@@ -0,0 +1,20 @@
+#!/bin/sh
+set -eu
+
+# "modprobe" without modprobe
+# https://twitter.com/lucabruno/status/902934379835662336
+
+# this isn't 100% fool-proof, but it'll have a much higher success rate than simply using the "real" modprobe
+
+# Docker often uses "modprobe -va foo bar baz"
+# so we ignore modules that start with "-"
+for module; do
+	if [ "${module#-}" = "$module" ]; then
+		ip link show "$module" || true
+		lsmod | grep "$module" || true
+	fi
+done
+
+# remove /usr/local/... from PATH so we can exec the real modprobe as a last resort
+export PATH='/usr/sbin:/usr/bin:/sbin:/bin'
+exec modprobe "$@"