diff --git a/ansible/prune-images.yml b/ansible/prune-images.yml
new file mode 100644
index 0000000000000000000000000000000000000000..2b6a3adae35318a5d27b510c8ff239990d8f53e6
--- /dev/null
+++ b/ansible/prune-images.yml
@@ -0,0 +1,9 @@
+---
+- import_playbook: gather-facts.yml
+
+- name: Apply role prune-images
+  hosts: baremetal
+  serial: '{{ kolla_serial|default("0") }}'
+  gather_facts: false
+  roles:
+    - prune-images
diff --git a/ansible/roles/prune-images/defaults/main.yml b/ansible/roles/prune-images/defaults/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..1cfdd158fb5c3bbf5ac9530a24094c1dcba8ba50
--- /dev/null
+++ b/ansible/roles/prune-images/defaults/main.yml
@@ -0,0 +1,2 @@
+---
+docker_image_prune_timeout: 300
diff --git a/ansible/roles/prune-images/tasks/main.yml b/ansible/roles/prune-images/tasks/main.yml
new file mode 100644
index 0000000000000000000000000000000000000000..e6ba54591426f3dd04fb64fb2135c62cc63e5b4d
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/main.yml
@@ -0,0 +1,4 @@
+---
+- include_tasks: validate_docker_execute.yml
+
+- include_tasks: prune_images.yml
diff --git a/ansible/roles/prune-images/tasks/prune_images.yml b/ansible/roles/prune-images/tasks/prune_images.yml
new file mode 100644
index 0000000000000000000000000000000000000000..154e5e5f04f40d50041e1f19d58c3d20a137561c
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/prune_images.yml
@@ -0,0 +1,8 @@
+---
+- name: Pruning Kolla images
+  become: true
+  docker_prune:
+    images: yes
+    images_filters:
+      label: kolla_version
+    timeout: "{{ docker_image_prune_timeout }}"
diff --git a/ansible/roles/prune-images/tasks/validate_docker_execute.yml b/ansible/roles/prune-images/tasks/validate_docker_execute.yml
new file mode 100644
index 0000000000000000000000000000000000000000..0e85832c6501850d90f6a20385160e45db18bc06
--- /dev/null
+++ b/ansible/roles/prune-images/tasks/validate_docker_execute.yml
@@ -0,0 +1,3 @@
+---
+- name: Ensure the docker service is running
+  script: ../tools/validate-docker-execute.sh
diff --git a/doc/source/user/operating-kolla.rst b/doc/source/user/operating-kolla.rst
index 77cafd18e32f8d2784756033a037d74ec2eb28cc..18f94659064bae919d8d3ae810fae4282bf0d04f 100644
--- a/doc/source/user/operating-kolla.rst
+++ b/doc/source/user/operating-kolla.rst
@@ -191,6 +191,9 @@ tests.
 ``kolla-ansible -i INVENTORY deploy-containers`` is used to check and if
 necessary update containers, without generating configuration.
 
+``kolla-ansible -i INVENTORY prune-images`` is used to prune orphaned Docker
+images on hosts.
+
 .. note::
 
    In order to do smoke tests, requires ``kolla_enable_sanity_checks=yes``.
diff --git a/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml b/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml
new file mode 100644
index 0000000000000000000000000000000000000000..b2a576a1aeea5be4d1936d4d24c5a01447bf8f1f
--- /dev/null
+++ b/releasenotes/notes/docker-image-pruning-fffcffa7e99c6e63.yaml
@@ -0,0 +1,7 @@
+---
+features:
+  - |
+    Adds command ``prune-images`` for Docker image pruning on hosts. See
+    `blueprint
+    <https://blueprints.launchpad.net/kolla-ansible/+spec/docker-image-pruning>`__
+    for details.
diff --git a/tools/kolla-ansible b/tools/kolla-ansible
index 733c69c89e0ce776dc573e9842566928526b51c6..7f4022a79f54897e338ea75a87e12882ff27d7c2 100755
--- a/tools/kolla-ansible
+++ b/tools/kolla-ansible
@@ -88,6 +88,7 @@ Commands:
     upgrade             Upgrades existing OpenStack Environment
     upgrade-bifrost     Upgrades an existing bifrost container
     genconfig           Generate configuration files for enabled OpenStack services
+    prune-images        Prune orphaned Kolla images
 EOF
 }
 
@@ -126,6 +127,7 @@ certificates
 upgrade
 upgrade-bifrost
 genconfig
+prune-images
 EOF
 }
 
@@ -391,6 +393,18 @@ EOF
         ACTION="Generate configuration files for enabled OpenStack services"
         EXTRA_OPTS="$EXTRA_OPTS -e kolla_action=config"
         ;;
+(prune-images)
+        ACTION="Prune orphaned Kolla images"
+        PLAYBOOK="${BASEDIR}/ansible/prune-images.yml"
+        if [[ "${DANGER_CONFIRM}" != "--yes-i-really-really-mean-it" ]]; then
+            cat << EOF
+WARNING:
+    This will PERMANENTLY DELETE all orphaned kolla images. To confirm, please add the following option:
+    --yes-i-really-really-mean-it
+EOF
+            exit 1
+        fi
+        ;;
 (bash-completion)
         bash_completion
         exit 0