docker_container: improve race condition behavior for detach:no, auto_remove:yes behavior (#47712)

* Don't die when get_container is called for container which is terminating during get_container call.

If it terminates between client.containers() and client.inspect_container(),
the module will fail with an error such as
    Error inspecting container: 404 Client Error: Not Found ("No such container: xxx")

* Add changelog.

(cherry picked from commit b9706e2ff5)
pull/47892/head
Felix Fontein 6 years ago committed by Toshio Kuratomi
parent 5bacb732ce
commit 08324198da

@ -0,0 +1,2 @@
bugfixes:
- "docker_container - fixing race condition when ``detach`` and ``auto_remove`` are both ``true``."

@ -35,7 +35,7 @@ HAS_DOCKER_ERROR = None
try: try:
from requests.exceptions import SSLError from requests.exceptions import SSLError
from docker import __version__ as docker_version from docker import __version__ as docker_version
from docker.errors import APIError, TLSParameterError, NotFound from docker.errors import APIError, NotFound, TLSParameterError
from docker.tls import TLSConfig from docker.tls import TLSConfig
from docker.constants import DEFAULT_DOCKER_API_VERSION from docker.constants import DEFAULT_DOCKER_API_VERSION
from docker import auth from docker import auth
@ -119,6 +119,9 @@ if not HAS_DOCKER_PY:
class APIError(Exception): class APIError(Exception):
pass pass
class NotFound(Exception): # noqa: F811
pass
def sanitize_result(data): def sanitize_result(data):
"""Sanitize data object for return to Ansible. """Sanitize data object for return to Ansible.
@ -442,6 +445,8 @@ class AnsibleDockerClient(Client):
self.log("Inspecting container Id %s" % result['Id']) self.log("Inspecting container Id %s" % result['Id'])
result = self.inspect_container(container=result['Id']) result = self.inspect_container(container=result['Id'])
self.log("Completed container inspection") self.log("Completed container inspection")
except NotFound as exc:
return None
except Exception as exc: except Exception as exc:
self.fail("Error inspecting container: %s" % exc) self.fail("Error inspecting container: %s" % exc)

Loading…
Cancel
Save