diff --git a/.gitlab-ci.yml b/.gitlab-ci.yml
index 94377a9a6161080d903dabb1ada5fd6cc5f5a5ea..fa0d95a44a58eb08021cecf1c443a1372567d630 100644
--- a/.gitlab-ci.yml
+++ b/.gitlab-ci.yml
@@ -4,6 +4,12 @@ image: docker.km3net.de/base/python:3
 # only cache local items.
 variables:
   PIP_CACHE_DIR: "$CI_PROJECT_DIR/.cache/pip"
+  DOCKER_HOST: tcp://docker:2375
+  DOCKER_DRIVER: overlay2
+  CONTAINER_TEST_IMAGE: docker.km3net.de/test/km3io:$CI_COMMIT_REF_SLUG
+  CONTAINER_RELEASE_IMAGE: docker.km3net.de/km3io:$CI_COMMIT_TAG
+  CONTAINER_LATEST_IMAGE: docker.km3net.de/km3io:latest
+  SINGULARITY_RELEASE_IMAGE: km3io_${CI_COMMIT_TAG}.sif
 
 cache:
   paths:
@@ -14,6 +20,8 @@ stages:
   - test
   - coverage
   - doc
+  - docker
+  - singularity
   - release
 
 .virtualenv_template: &virtualenv_definition |
@@ -103,6 +111,20 @@ pages:
         - master
 
 
+docker:
+  image: docker:stable
+  services:
+    - docker:dind
+  stage: docker
+  script:
+    - docker build --pull -t $CONTAINER_TEST_IMAGE .
+    - docker push $CONTAINER_TEST_IMAGE
+  tags:
+    - docker
+  only:
+    - tags
+
+
 pypi:
     image: docker.km3net.de/base/python:3
     stage: release
@@ -127,3 +149,31 @@ cc-lyon:
         - tags
         - master
     allow_failure: true
+
+release-docker:
+  image: docker:stable
+  services:
+    - docker:dind
+  stage: release
+  script:
+    - docker pull $CONTAINER_TEST_IMAGE
+    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_RELEASE_IMAGE
+    - docker tag $CONTAINER_TEST_IMAGE $CONTAINER_LATEST_IMAGE
+    - docker push $CONTAINER_RELEASE_IMAGE
+    - docker push $CONTAINER_LATEST_IMAGE
+  tags:
+    - docker
+  only:
+    - tags
+
+release-singularity:
+  image: docker.km3net.de/base/singularity:3.6.2
+  stage: release
+  script:
+    - singularity build $SINGULARITY_RELEASE_IMAGE docker://$CONTAINER_TEST_IMAGE
+    - du -sh $SINGULARITY_RELEASE_IMAGE
+    - mkdir -p ~/.ssh && ssh-keyscan -H -t rsa $KM3NET_SFTP_HOST  >> ~/.ssh/known_hosts
+    - apt install -q lftp
+    - lftp -u $KM3NET_SFTP_USER,$KM3NET_SFTP_PASSWORD sftp://$KM3NET_SFTP_HOST -e "set ssl:verify-certificate no; cd singularity/; put $SINGULARITY_RELEASE_IMAGE; bye"
+  only:
+    - tags
diff --git a/Dockerfile b/Dockerfile
new file mode 100644
index 0000000000000000000000000000000000000000..6c423e74e29250c674ce17b61b6c8c79cd89470c
--- /dev/null
+++ b/Dockerfile
@@ -0,0 +1,15 @@
+FROM debian:buster-slim
+LABEL maintainer="Tamas Gal <tgal@km3net.de>"
+
+ ENV INSTALL_DIR /km3io
+
+ RUN apt-get update
+ RUN apt-get install -y -qq git python3-pip && apt-get -y clean && apt-get autoclean
+ RUN python3 -m pip install --upgrade pip setuptools wheel
+
+ ADD . $INSTALL_DIR
+ RUN cd $INSTALL_DIR && python3 -m pip install . ".[dev]" ".[extras]"
+
+ # Clean up
+ RUN cd / && rm -rf $INSTALL_DIR
+ RUN rm -rf /var/cache