diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index e35789def0cfe075414a549041e95c960b8a2c40..a7a7dce05b49eff60f4ca879c96f005efc1e614f 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -2,6 +2,8 @@ image: node:16-alpine
 stages:
   - setup
   - test
+  - docker
+  - deploy
 
 install-dependencies:
   stage: setup
@@ -44,3 +46,21 @@ test:
   extends: .distributed
   script:
     - yarn nx affected --base=HEAD~1 --target=test --parallel --max-parallel=2
+
+build-docker:
+  image: docker:stable
+  stage: docker
+  tags:
+    - docker
+  only:
+    - main
+    - develop
+  script:
+    - docker build --progress plain -f ./apps/frontend/Dockerfile . -t $CI_PROJECT_NAME:latest
+  after_script:
+    - docker login datastropheregistry.azurecr.io -u $REGISTRY_USERNAME -p $REGISTRY_PASSWORD
+    - if [[ ! -z $CI_COMMIT_BRANCH+x ]]; then DOCKER_TAG=$CI_COMMIT_BRANCH; else DOCKER_TAG=$CI_MERGE_REQUEST_TARGET_BRANCH_NAME; fi
+    - docker tag $CI_PROJECT_NAME datastropheregistry.azurecr.io/$CI_PROJECT_NAME:$DOCKER_TAG
+    - docker push datastropheregistry.azurecr.io/$CI_PROJECT_NAME:$DOCKER_TAG
+  dependencies:
+    - build