diff --git a/puppet/services/docker.yaml b/puppet/services/docker.yaml
index 6194c27d3e..361e518c9e 100644
--- a/puppet/services/docker.yaml
+++ b/puppet/services/docker.yaml
@@ -103,16 +103,38 @@ outputs:
           yum: name=docker state=latest
       update_tasks:
         block:
+          - name: Detect if puppet on the docker profile would restart the service
+            # Note that due to https://tickets.puppetlabs.com/browse/PUP-686 --noop
+            # always exits 0, so we cannot rely on that to detect if puppet is going to change stuff
+            shell: |
+              puppet apply --noop --summarize --detailed-exitcodes --verbose \
+                --modulepath /etc/puppet/modules:/opt/stack/puppet-modules:/usr/share/openstack-puppet/modules \
+                --color=false -e "class { 'tripleo::profile::base::docker': step => 1, }" 2>&1 | \
+              awk -F ":" '/Out of sync:/ { print $2}'
+            register: puppet_docker_noop_output
+            failed_when: false
+          - name: Is docker going to be updated
+            shell: yum check-update docker
+            register: docker_check_update
+            failed_when: docker_check_update.rc not in [0, 100]
+            changed_when: docker_check_update.rc == 100
+          - name: Set docker_rpm_needs_update fact
+            set_fact: docker_rpm_needs_update={{ docker_check_update.rc == 100 }}
+          - name: Set puppet_docker_is_outofsync fact
+            set_fact: puppet_docker_is_outofsync={{ puppet_docker_noop_output.stdout|trim|int >= 1 }}
           - name: Stop all containers
             # xargs is preferable to docker stop $(docker ps -q) as that might generate a
             # a too long command line
             shell: docker ps -q | xargs --no-run-if-empty -n1 docker stop
+            when: puppet_docker_is_outofsync or docker_rpm_needs_update
           - name: Stop docker
             service:
               name: docker
               state: stopped
+            when: puppet_docker_is_outofsync or docker_rpm_needs_update
           - name: Update the docker package
             yum: name=docker state=latest update_cache=yes # cache for tripleo/+bug/1703830
+            when: docker_rpm_needs_update
           - name: Apply puppet which will start the service again
             shell: |
               puppet apply --detailed-exitcodes --verbose \