diff --git a/scripts/gitlab-ci/docker-build.sh b/scripts/gitlab-ci/docker-build.sh
new file mode 100644
index 0000000000000000000000000000000000000000..bf7bf30e760e0507fa7776bea287c101f96056f1
--- /dev/null
+++ b/scripts/gitlab-ci/docker-build.sh
@@ -0,0 +1,43 @@
+#!/bin/bash
+#
+# Script to build Docker image and push to internal registry.
+##
+
+BUILD_ARGS="";
+
+for arg in ${DOCKER_BUILD_ARGS}; do
+  BUILD_ARGS="${BUILD_ARGS} --build-arg ${arg}";
+done
+
+# Build Docker image
+docker build \
+    "${BUILD_ARGS}" \
+    --pull \
+    --tag "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_REF_SLUG}" \
+    --file "${CI_PROJECT_DIR}/${DOCKERFILE}" \
+    "${CI_PROJECT_DIR}/.";
+
+# Push image to internal registry
+docker push "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_REF_SLUG}";
+
+# Push latest tag
+if [[
+    ${CI_COMMIT_REF_SLUG} == "master" ||
+    ${CI_COMMIT_REF_SLUG} == "production" ||
+    -n "${CI_COMMIT_TAG}"
+]]; then
+  docker tag \
+      "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_REF_SLUG}" \
+      "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:latest";
+  docker push "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:latest";
+fi
+
+# Push specific tag
+if [[
+    -n "${CI_COMMIT_TAG}"
+]]; then
+  docker tag \
+      "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:latest" \
+      "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_TAG}";
+  docker push "${CODE_REGISTRY_IMAGE}/${IMAGE_NAME}:${CI_COMMIT_TAG}";
+fi