diff --git a/changelogs/fragments/55894-docker_container-restart.yml b/changelogs/fragments/55894-docker_container-restart.yml new file mode 100644 index 00000000000..a13ba185ac0 --- /dev/null +++ b/changelogs/fragments/55894-docker_container-restart.yml @@ -0,0 +1,2 @@ +bugfixes: +- "docker_container - use docker API's ``restart`` instead of ``stop``/``start`` to restart a container." \ No newline at end of file diff --git a/lib/ansible/modules/cloud/docker/docker_container.py b/lib/ansible/modules/cloud/docker/docker_container.py index f5a1905c37a..b783ce5a773 100644 --- a/lib/ansible/modules/cloud/docker/docker_container.py +++ b/lib/ansible/modules/cloud/docker/docker_container.py @@ -2351,8 +2351,8 @@ class ContainerManager(DockerBaseClass): container = self.container_start(container.Id) elif state == 'started' and self.parameters.restart: self.diff_tracker.add('running', parameter=True, active=was_running) - self.container_stop(container.Id) - container = self.container_start(container.Id) + self.diff_tracker.add('restarted', parameter=True, active=False) + container = self.container_restart(container.Id) elif state == 'stopped' and container.running: self.diff_tracker.add('running', parameter=False, active=was_running) self.container_stop(container.Id) @@ -2634,6 +2634,19 @@ class ContainerManager(DockerBaseClass): self.fail("Error killing container %s: %s" % (container_id, exc)) return response + def container_restart(self, container_id): + self.results['actions'].append(dict(restarted=container_id, timeout=self.parameters.stop_timeout)) + self.results['changed'] = True + if not self.check_mode: + try: + if self.parameters.stop_timeout: + response = self.client.restart(container_id, timeout=self.parameters.stop_timeout) + else: + response = self.client.restart(container_id) + except Exception as exc: + self.fail("Error restarting container %s: %s" % (container_id, str(exc))) + return self._get_container(container_id) + def container_stop(self, container_id): if self.parameters.force_kill: self.container_kill(container_id) diff --git a/test/integration/targets/docker_container/tasks/tests/options.yml b/test/integration/targets/docker_container/tasks/tests/options.yml index 52260b26878..41e954d79ab 100644 --- a/test/integration/targets/docker_container/tasks/tests/options.yml +++ b/test/integration/targets/docker_container/tasks/tests/options.yml @@ -2776,8 +2776,8 @@ avoid such warnings, please quote the value.' in log_options_2.warnings" name: "{{ cname }}" state: started published_ports: - - 9001 - - 9002 + - '9001' + - '9002' register: published_ports_1 - name: published_ports (idempotency) @@ -2787,8 +2787,8 @@ avoid such warnings, please quote the value.' in log_options_2.warnings" name: "{{ cname }}" state: started published_ports: - - 9002 - - 9001 + - '9002' + - '9001' register: published_ports_2 - name: published_ports (less published_ports) @@ -2798,7 +2798,7 @@ avoid such warnings, please quote the value.' in log_options_2.warnings" name: "{{ cname }}" state: started published_ports: - - 9002 + - '9002' register: published_ports_3 - name: published_ports (more published_ports) @@ -2808,8 +2808,8 @@ avoid such warnings, please quote the value.' in log_options_2.warnings" name: "{{ cname }}" state: started published_ports: - - 9002 - - 9003 + - '9002' + - '9003' force_kill: yes register: published_ports_4 @@ -2878,109 +2878,6 @@ avoid such warnings, please quote the value.' in log_options_2.warnings" - read_only_2 is not changed - read_only_3 is changed -#################################################################### -## recreate ######################################################## -#################################################################### - -- name: recreate (created) - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - state: present - force_kill: yes - register: recreate_1 - -- name: recreate (created, recreate) - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - recreate: yes - state: present - force_kill: yes - register: recreate_2 - -- name: recreate (started) - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - state: started - force_kill: yes - register: recreate_3 - -- name: recreate (started, recreate) - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - recreate: yes - state: started - force_kill: yes - register: recreate_4 - -- name: cleanup - docker_container: - name: "{{ cname }}" - state: absent - force_kill: yes - diff: no - -- debug: var=recreate_1 -- debug: var=recreate_2 -- debug: var=recreate_3 -- debug: var=recreate_4 - -- assert: - that: - - recreate_1 is changed - - recreate_2 is changed - - recreate_3 is changed - - recreate_4 is changed - - recreate_1.container.Id != recreate_2.container.Id - - recreate_2.container.Id == recreate_3.container.Id - - recreate_3.container.Id != recreate_4.container.Id - -#################################################################### -## restart ######################################################### -#################################################################### - -- name: restart - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - state: started - force_kill: yes - register: restart_1 - -- name: restart (restart) - docker_container: - image: alpine:3.8 - command: '/bin/sh -c "sleep 10m"' - name: "{{ cname }}" - restart: yes - state: started - force_kill: yes - register: restart_2 - -- name: cleanup - docker_container: - name: "{{ cname }}" - state: absent - force_kill: yes - diff: no - -- debug: var=restart_1 -- debug: var=restart_2 - -- assert: - that: - - restart_1 is changed - - restart_2 is changed - - restart_1.container.Id == restart_2.container.Id - #################################################################### ## restart_policy ################################################## #################################################################### diff --git a/test/integration/targets/docker_container/tasks/tests/start-stop.yml b/test/integration/targets/docker_container/tasks/tests/start-stop.yml index 2169a103637..33ea0aca9e9 100644 --- a/test/integration/targets/docker_container/tasks/tests/start-stop.yml +++ b/test/integration/targets/docker_container/tasks/tests/start-stop.yml @@ -169,6 +169,120 @@ - start_scratch_3 is not changed - start_scratch_4 is not changed +#################################################################### +## Recreating ###################################################### +#################################################################### + +- name: Recreating container (created) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + state: present + force_kill: yes + register: recreate_1 + +- name: Recreating container (created, recreate) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + recreate: yes + state: present + force_kill: yes + register: recreate_2 + +- name: Recreating container (started) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + state: started + force_kill: yes + register: recreate_3 + +- name: Recreating container (started, recreate) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + recreate: yes + state: started + force_kill: yes + register: recreate_4 + +- name: cleanup + docker_container: + name: "{{ cname }}" + state: absent + force_kill: yes + diff: no + +- debug: var=recreate_1 +- debug: var=recreate_2 +- debug: var=recreate_3 +- debug: var=recreate_4 + +- assert: + that: + - recreate_2 is changed + - recreate_3 is changed + - recreate_4 is changed + - recreate_1.container.Id != recreate_2.container.Id + - recreate_2.container.Id == recreate_3.container.Id + - recreate_3.container.Id != recreate_4.container.Id + +#################################################################### +## Restarting ###################################################### +#################################################################### + +- name: Restarting + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + state: started + stop_timeout: 1 + volumes: + - /tmp/tmp + register: restart_1 + +- name: Restarting (restart) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + restart: yes + state: started + stop_timeout: 1 + force_kill: yes + register: restart_2 + +- name: Restarting (verify volumes) + docker_container: + image: alpine:3.8 + command: '/bin/sh -c "sleep 10m"' + name: "{{ cname }}" + state: started + stop_timeout: 1 + volumes: + - /tmp/tmp + register: restart_3 + +- name: cleanup + docker_container: + name: "{{ cname }}" + state: absent + force_kill: yes + diff: no + +- assert: + that: + - restart_1 is changed + - restart_2 is changed + - restart_1.container.Id == restart_2.container.Id + - restart_3 is not changed + #################################################################### ## Stopping ######################################################## ####################################################################