diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 9b3f8114220cecd64a59ea3a1f84b86de0a1cf72..939591391f6d3b058728bbbada0e08112af93f7c 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -1,5 +1,153 @@
+image: docker:latest
+
+services:
+  - docker:dind
+
+before_script:
+  - docker login -u "$CI_REGISTRY_USER" -p "$CI_REGISTRY_PASSWORD" $CI_REGISTRY
+
+#
+# TESTS
+#
+
 lint_dockerfile:
   stage: test
   image: hadolint/hadolint:latest-debian
+  before_script:
+    - mkdir ~/.config
+    - cp ./.hadolint.yaml ~/.config/hadolint.yaml
   script:
     - find . -name "Dockerfile" -execdir hadolint {} \;
+
+#
+# IMAGE BUILDS/PUSHES
+#
+
+# Golang
+build-golang-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/golang:latest" ./golang/latest
+    - docker push "$CI_REGISTRY_IMAGE/golang:latest"
+  only:
+    - master
+  when: manual
+
+build-golang-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/golang:latest-dev" ./golang/latest
+    - docker push "$CI_REGISTRY_IMAGE/golang:latest-dev"
+  except:
+    - master
+
+# PHP 7.3
+build-php-7.3-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.3" ./php/7.3
+    - docker push "$CI_REGISTRY_IMAGE/php:7.3"
+  only:
+    - master
+  when: manual
+
+build-php-7.3-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.3-dev" ./php/7.3
+    - docker push "$CI_REGISTRY_IMAGE/php:7.3-dev"
+  except:
+    - master
+
+# PHP 7.2
+build-php-7.2-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.2" ./php/7.2
+    - docker push "$CI_REGISTRY_IMAGE/php:7.2"
+  only:
+    - master
+  when: manual
+
+build-php-7.2-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.2-dev" ./php/7.2
+    - docker push "$CI_REGISTRY_IMAGE/php:7.2-dev"
+  except:
+    - master
+
+# PHP 7.1
+build-php-7.1-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.1" ./php/7.1
+    - docker push "$CI_REGISTRY_IMAGE/php:7.1"
+  only:
+    - master
+  when: manual
+
+build-php-7.1-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.1-dev" ./php/7.1
+    - docker push "$CI_REGISTRY_IMAGE/php:7.1-dev"
+  except:
+    - master
+
+# PHP 7.0
+build-php-7.0-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.0" ./php/7.0
+    - docker push "$CI_REGISTRY_IMAGE/php:7.0"
+  only:
+    - master
+  when: manual
+
+build-php-7.0-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:7.0-dev" ./php/7.0
+    - docker push "$CI_REGISTRY_IMAGE/php:7.0-dev"
+  except:
+    - master
+  allow_failure: true
+
+# PHP 5.6
+build-php-5.6-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:5.6" ./php/5.6
+    - docker push "$CI_REGISTRY_IMAGE/php:5.6"
+  only:
+    - master
+  when: manual
+
+build-php-5.6-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:5.6-dev" ./php/5.6
+    - docker push "$CI_REGISTRY_IMAGE/php:5.6-dev"
+  except:
+    - master
+  allow_failure: true
+
+# PHP 5.3
+build-php-5.3-master:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:5.3" ./php/5.3
+    - docker push "$CI_REGISTRY_IMAGE/php:5.3"
+  only:
+    - master
+  when: manual
+
+build-php-5.3-dev:
+  stage: deploy
+  script:
+    - docker build --pull -t "$CI_REGISTRY_IMAGE/php:5.3-dev" ./php/5.3
+    - docker push "$CI_REGISTRY_IMAGE/php:5.3-dev"
+  except:
+    - master
+  allow_failure: true
diff --git a/.hadolint.yaml b/.hadolint.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..395c31fb3dfa473f5383fc4a9663d3f20913454b
--- /dev/null
+++ b/.hadolint.yaml
@@ -0,0 +1,3 @@
+ignored:
+  - DL3007
+  - DL3008
diff --git a/README.md b/README.md
index 655b595dff06068d17928a76f9b38d6fab424f3a..79543d86e763f42018975e00003684e1dc8d1587 100644
--- a/README.md
+++ b/README.md
@@ -1,4 +1,7 @@
-Docker Images
-=============
+# Docker Images [![pipeline status](https://git.ethitter.com/docker/images/badges/master/pipeline.svg)](https://git.ethitter.com/docker/images/commits/master)
 
-A collection of images used with GitLab CI
\ No newline at end of file
+A collection of images used with GitLab CI, built using GitLab CI. ♾
+
+## Use
+
+See this project's container registry for available images.
diff --git a/golang/latest/Dockerfile b/golang/latest/Dockerfile
index f5d9b433102ded90a16ddbef5fdbb16889882923..ae4e08495de63878397c76902a1846e5329e732b 100644
--- a/golang/latest/Dockerfile
+++ b/golang/latest/Dockerfile
@@ -1,6 +1,8 @@
 # Base image: https://hub.docker.com/_/golang/
 FROM golang:latest
-MAINTAINER ethitter
+
+LABEL maintainer="ethitter"
+LABEL version="1.0"
 
 # Install golint
 ENV GOPATH /go
@@ -8,9 +10,11 @@ ENV PATH ${GOPATH}/bin:$PATH
 RUN go get -u github.com/golang/lint/golint
 
 # Add apt key for LLVM repository
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN wget -O - https://apt.llvm.org/llvm-snapshot.gpg.key | apt-key add -
 
 # Add LLVM apt repository
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN echo "deb http://apt.llvm.org/stretch/ llvm-toolchain-stretch-5.0 main" | tee -a /etc/apt/sources.list
 
 # Install clang from LLVM repository
@@ -21,4 +25,5 @@ RUN apt-get update && apt-get install -y --no-install-recommends \
 
 # Set Clang as default CC
 ENV set_clang /etc/profile.d/set-clang-cc.sh
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN echo "export CC=clang-5.0" | tee -a ${set_clang} && chmod a+x ${set_clang}
diff --git a/php/5.3/Dockerfile b/php/5.3/Dockerfile
index 2eee5f47661b63831fb8c7f85fc96273924a449d..6b4a712ff5b890e4f73ee56d558a5b0f1b80ae38 100644
--- a/php/5.3/Dockerfile
+++ b/php/5.3/Dockerfile
@@ -1,9 +1,16 @@
 FROM tetraweb/php:5.3
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev libmysqlclient-dev libfreetype6-dev libjpeg-dev libxpm-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev libmysqlclient-dev libfreetype6-dev libjpeg-dev libxpm-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer
 
diff --git a/php/5.6/Dockerfile b/php/5.6/Dockerfile
index 21cc36f1718dde9f33ac0d7d0711a4a1fb719647..e895f857a4024f2cb6876efa1bbac6278b6851a4 100644
--- a/php/5.6/Dockerfile
+++ b/php/5.6/Dockerfile
@@ -1,9 +1,16 @@
 FROM php:5.6-stretch
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer
 
diff --git a/php/7.0/Dockerfile b/php/7.0/Dockerfile
index 2b5bd5d1d451e18bd532bf3985fd822025504729..48283e75da32997a06d47de15e485aabbcda1c20 100644
--- a/php/7.0/Dockerfile
+++ b/php/7.0/Dockerfile
@@ -1,9 +1,16 @@
 FROM php:7.0-stretch
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer
 
diff --git a/php/7.1/Dockerfile b/php/7.1/Dockerfile
index bca230c948387c75ce98398a1853dec377ab6a24..816f0eb0cc1181a0f28d0ccceafc6bd4f28ddb13 100644
--- a/php/7.1/Dockerfile
+++ b/php/7.1/Dockerfile
@@ -1,9 +1,16 @@
 FROM php:7.1-stretch
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer
 
diff --git a/php/7.2/Dockerfile b/php/7.2/Dockerfile
index d2a0cbe16c1cf9156cc51d67ba2471cee411f9ff..4d0b94709ae157dc0bddc9ad03a3a0141acbda26 100644
--- a/php/7.2/Dockerfile
+++ b/php/7.2/Dockerfile
@@ -1,9 +1,16 @@
 FROM php:7.2-stretch
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer
 
diff --git a/php/7.3/Dockerfile b/php/7.3/Dockerfile
index 771ddc8195e4837abe09b5cc7a39b9ba6a2a3670..847c4c774514c467d9b5bee6effcd09fcdd88cbb 100644
--- a/php/7.3/Dockerfile
+++ b/php/7.3/Dockerfile
@@ -1,9 +1,16 @@
 FROM php:7.3-stretch
-MAINTAINER ethitter
 
-RUN apt-get update && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev libzip-dev --fix-missing
+LABEL maintainer="ethitter"
+LABEL version="1.0"
+
+RUN apt-get update \
+    && apt-get -yqqf install lsb-release zip unzip subversion mysql-client libicu-dev libpng-dev libbz2-dev default-libmysqlclient-dev libzip-dev --fix-missing --no-install-recommends \
+    && apt-get clean \
+    && rm -rf /var/lib/apt/lists/*
+
 RUN docker-php-ext-install mbstring mysqli intl gd zip bz2
 
+SHELL ["/bin/bash", "-o", "pipefail", "-c"]
 RUN curl -sS https://getcomposer.org/installer | php -- --install-dir=/usr/local/bin --filename=composer
 RUN chmod +x /usr/local/bin/composer