--- # Upgrading docker engine may cause containers to stop. Take a snapshot of the # running containers prior to a potential upgrade of Docker. - name: Check which containers are running command: docker ps -f 'status=running' -q become: true # If Docker is not installed this command may exit non-zero. failed_when: false changed_when: false register: running_containers # APT starts Docker engine right after installation, which creates # iptables rules before we disable iptables in Docker config - block: - name: Check if docker systemd unit exists stat: path: /etc/systemd/system/docker.service register: docker_unit_file - name: Mask the docker systemd unit on Debian/Ubuntu file: src: /dev/null dest: /etc/systemd/system/docker.service owner: root group: root state: link become: true when: not docker_unit_file.stat.exists when: ansible_facts.os_family == 'Debian' - name: Install packages package: name: "{{ docker_packages | select | list }}" cache_valid_time: "{{ apt_cache_valid_time if ansible_facts.os_family == 'Debian' else omit }}" update_cache: true state: present become: true register: docker_install_result # If any packages were updated, and any containers were running, wait for the # daemon to come up and start all previously running containers. - block: # At some point (at least on CentOS 7) Docker CE stopped starting # automatically after an upgrade from legacy docker . Start it manually. - name: Start docker systemd: name: docker state: started enabled: true masked: false become: true - name: Wait for Docker to start command: docker info become: true changed_when: false register: result until: result is success retries: 6 delay: 10 - name: Ensure containers are running after Docker upgrade # noqa no-changed-when command: "docker start {{ running_containers.stdout }}" become: true changed_when: true when: - docker_install_result is changed - running_containers.rc == 0 - running_containers.stdout != ''