diff --git a/roles/ensure-docker/tasks/docker-upstream.yaml b/roles/ensure-docker/tasks/docker-upstream.yaml
index 3e9f887b9..f7420521e 100644
--- a/roles/ensure-docker/tasks/docker-upstream.yaml
+++ b/roles/ensure-docker/tasks/docker-upstream.yaml
@@ -18,6 +18,18 @@
         repositories_keys: "{{ _docker_keys }}"
         repositories_list: "{{ _docker_repos }}"
 
+    # Workaround for docker-ce installation failure due conflict with containerd.io
+    # https://bugzilla.redhat.com/show_bug.cgi?id=1756473#c1
+    - name: Patch docker-ce.repo for newer RedHat distros
+      when: ansible_os_family == 'RedHat' and ansible_distribution_major_version == '8'
+      ini_file:
+        path: /etc/yum.repos.d/docker-ce.repo
+        section: docker-ce-stable
+        option: module_hotfixes
+        value: "True"
+        no_extra_spaces: true
+        create: false
+
     - name: Install pre-reqs
       package:
         name: "{{ _docker_upstream_distro_required_packages }}"
@@ -29,23 +41,10 @@
         state: absent
       when: docker_upstream_distro_remove_packages
 
-    # package/dnf module do not support `--nobest` option which is needed for
-    # installing docker-ce on centos-8
     - name: Install upstream docker using package
-      when: not (ansible_os_family == 'RedHat' and ansible_distribution_major_version == '8')
       package:
         name: "{{ docker_upstream_distro_packages }}"
         state: present
       notify: Restart docker
 
-    - name: Install upstream docker using shell
-      when: ansible_os_family == 'RedHat' and ansible_distribution_major_version == '8'
-      shell:
-        cmd: |
-          dnf install --nobest -y {{ docker_upstream_distro_packages | join(' ') }}
-        warn: false
-      register: result
-      changed_when: "'Complete!' in result.stdout"
-      notify: Restart docker
-
     - include_tasks: docker-setup.yaml
diff --git a/roles/ensure-docker/vars/redhat.yaml b/roles/ensure-docker/vars/redhat.yaml
index 9c1547568..e8b54533f 100644
--- a/roles/ensure-docker/vars/redhat.yaml
+++ b/roles/ensure-docker/vars/redhat.yaml
@@ -33,7 +33,10 @@ _docker_keys:
 
 _docker_repos:
   # TODO(mordred) We should add a proxy cache mirror for this
+  # Keep 'name' (section) and 'file' in sync with https://download.docker.com/linux/centos/docker-ce.repo
+  # to avoid breaking tools that assume standard repository install.
   - name: docker-ce-stable
+    file: docker-ce
     description: Docker CE Stable - $basearch
     baseurl: "{{ docker_mirror_base_url }}/7/$basearch/stable"
     gpgcheck: yes
diff --git a/roles/ensure-package-repositories/tasks/RedHat.yaml b/roles/ensure-package-repositories/tasks/RedHat.yaml
index 3e8c5d9d1..790d179ab 100644
--- a/roles/ensure-package-repositories/tasks/RedHat.yaml
+++ b/roles/ensure-package-repositories/tasks/RedHat.yaml
@@ -32,6 +32,7 @@
 - name: Add repositories
   yum_repository:
     name: "{{ zj_item['name'] }}"
+    file: "{{ zj_item['file'] | default(zj_item['name']) }}"
     description: "{{ zj_item['description'] | default(omit) }}"
     baseurl: "{{ zj_item['baseurl'] | default(omit) }}"
     gpgcheck: "{{ zj_item['gpgcheck'] | default(omit) }}"