diff --git a/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.service b/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.service
new file mode 100644
index 0000000000000000000000000000000000000000..2c49032f6a2b4e3e8c47b1885e5780f6d57a1742
--- /dev/null
+++ b/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.service
@@ -0,0 +1,7 @@
+[Unit]
+Description=Cleanup containers, images and volumes produced by GitLab Runner
+
+[Service]
+Type=oneshot
+ExecStart=docker system prune --force --filter label=com.gitlab.gitlab-runner.managed=true --volumes
+ExecStart=docker image prune --all --force --filter until=168h
diff --git a/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.timer b/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.timer
new file mode 100644
index 0000000000000000000000000000000000000000..50378b2522a7489883c21d7db66c1a48bced81dd
--- /dev/null
+++ b/roles/gitlab_runner/files/gitlab-runner-docker-cleanup.timer
@@ -0,0 +1,10 @@
+[Unit]
+Description=Run gitlab-runner-docker-cleanup.service daily
+
+[Timer]
+OnCalendar=weekly
+Persistent=true
+RandomizedDelaySec=1d
+
+[Install]
+WantedBy=timers.target
diff --git a/roles/gitlab_runner/handlers/main.yml b/roles/gitlab_runner/handlers/main.yml
index 2e33942c7e30db45d2fb1a8adb0ac3d5a953141f..40375983ec25e807e9bbb9fb2dcdae35aaa17d6a 100644
--- a/roles/gitlab_runner/handlers/main.yml
+++ b/roles/gitlab_runner/handlers/main.yml
@@ -4,5 +4,8 @@
 - name: restart gitlab-runner
   service: name=gitlab-runner state=restarted
 
+- name: restart gitlab-runner-docker-cleanup.timer
+  service: name=gitlab-runner-docker-cleanup.timer state=restarted daemon_reload=yes
+
 - name: restart docker
   service: name=docker state=restarted
diff --git a/roles/gitlab_runner/tasks/main.yml b/roles/gitlab_runner/tasks/main.yml
index 52dee99660fc5ce547c0af534b069de3ed001b0a..88d9cc09499b882342a293854313c6ca98826f77 100644
--- a/roles/gitlab_runner/tasks/main.yml
+++ b/roles/gitlab_runner/tasks/main.yml
@@ -64,5 +64,16 @@
     line: listen_address = ":{{ gitlab_runner_exporter_port }}"
   notify: restart gitlab-runner
 
+- name: install gitlab-runner-docker-cleanup.{service,timer}
+  copy: src={{ item }} dest=/etc/systemd/system/{{ item }} owner=root group=root mode=0644
+  loop:
+    - gitlab-runner-docker-cleanup.service
+    - gitlab-runner-docker-cleanup.timer
+  notify:
+    - restart gitlab-runner-docker-cleanup.timer
+
+- name: enable and start gitlab-runner-docker-cleanup.timer
+  systemd: name=gitlab-runner-docker-cleanup.timer state=started enabled=yes daemon_reload=yes
+
 - name: enable and start gitlab runner service
   systemd: name=gitlab-runner state=started enabled=yes daemon_reload=yes