diff --git a/docker/client.py b/docker/client.py
index b1f72e97..88bc50de 100644
--- a/docker/client.py
+++ b/docker/client.py
@@ -41,7 +41,7 @@ class Client(clientbase.ClientBase):
             'stderr': stderr and 1 or 0,
             'stream': stream and 1 or 0,
         }
-        u = self._url("/containers/{0}/attach".format(container))
+        u = self._url("/containers/{0}/attach", container)
         response = self._post(u, params=params, stream=stream)
 
         return self._get_result(container, stream, response)
@@ -58,7 +58,7 @@ class Client(clientbase.ClientBase):
         if ws:
             return self._attach_websocket(container, params)
 
-        u = self._url("/containers/{0}/attach".format(container))
+        u = self._url("/containers/{0}/attach", container)
         return self._get_raw_response_socket(self.post(
             u, None, params=self._attach_params(params), stream=True))
 
@@ -275,8 +275,9 @@ class Client(clientbase.ClientBase):
 
     @check_resource
     def diff(self, container):
-        return self._result(self._get(self._url("/containers/{0}/changes".
-                            format(container))), True)
+        return self._result(
+            self._get(self._url("/containers/{0}/changes", container)), True
+        )
 
     def events(self, since=None, until=None, filters=None, decode=None):
         if isinstance(since, datetime):
@@ -326,7 +327,7 @@ class Client(clientbase.ClientBase):
             'Cmd': cmd
         }
 
-        url = self._url('/containers/{0}/exec'.format(container))
+        url = self._url('/containers/{0}/exec', container)
         res = self._post_json(url, data=data)
         return self._result(res, True)
 
@@ -337,7 +338,7 @@ class Client(clientbase.ClientBase):
             )
         if isinstance(exec_id, dict):
             exec_id = exec_id.get('Id')
-        res = self._get(self._url("/exec/{0}/json".format(exec_id)))
+        res = self._get(self._url("/exec/{0}/json", exec_id))
         return self._result(res, True)
 
     def exec_resize(self, exec_id, height=None, width=None):
@@ -347,7 +348,7 @@ class Client(clientbase.ClientBase):
             exec_id = exec_id.get('Id')
 
         params = {'h': height, 'w': width}
-        url = self._url("/exec/{0}/resize".format(exec_id))
+        url = self._url("/exec/{0}/resize", exec_id)
         res = self._post(url, params=params)
         self._raise_for_status(res)
 
@@ -362,27 +363,28 @@ class Client(clientbase.ClientBase):
             'Detach': detach
         }
 
-        res = self._post_json(self._url('/exec/{0}/start'.format(exec_id)),
-                              data=data, stream=stream)
+        res = self._post_json(
+            self._url('/exec/{0}/start', exec_id), data=data, stream=stream
+        )
         return self._get_result_tty(stream, res, tty)
 
     @check_resource
     def export(self, container):
-        res = self._get(self._url("/containers/{0}/export".format(container)),
-                        stream=True)
+        res = self._get(
+            self._url("/containers/{0}/export", container), stream=True
+        )
         self._raise_for_status(res)
         return res.raw
 
     @check_resource
     def get_image(self, image):
-        res = self._get(self._url("/images/{0}/get".format(image)),
-                        stream=True)
+        res = self._get(self._url("/images/{0}/get", image), stream=True)
         self._raise_for_status(res)
         return res.raw
 
     @check_resource
     def history(self, image):
-        res = self._get(self._url("/images/{0}/history".format(image)))
+        res = self._get(self._url("/images/{0}/history", image))
         return self._result(res, True)
 
     def images(self, name=None, quiet=False, all=False, viz=False,
@@ -496,7 +498,7 @@ class Client(clientbase.ClientBase):
             raise errors.DeprecatedMethod(
                 'insert is not available for API version >=1.12'
             )
-        api_url = self._url("/images/{0}/insert".format(image))
+        api_url = self._url("/images/{0}/insert", image)
         params = {
             'url': url,
             'path': path
@@ -506,21 +508,18 @@ class Client(clientbase.ClientBase):
     @check_resource
     def inspect_container(self, container):
         return self._result(
-            self._get(self._url("/containers/{0}/json".format(container))),
-            True)
+            self._get(self._url("/containers/{0}/json", container)), True
+        )
 
     @check_resource
     def inspect_image(self, image):
         return self._result(
-            self._get(
-                self._url("/images/{0}/json".format(image.replace('/', '%2F')))
-            ),
-            True
+            self._get(self._url("/images/{0}/json", image)), True
         )
 
     @check_resource
     def kill(self, container, signal=None):
-        url = self._url("/containers/{0}/kill".format(container))
+        url = self._url("/containers/{0}/kill", container)
         params = {}
         if signal is not None:
             params['signal'] = signal
@@ -583,7 +582,7 @@ class Client(clientbase.ClientBase):
                 if tail != 'all' and (not isinstance(tail, int) or tail <= 0):
                     tail = 'all'
                 params['tail'] = tail
-            url = self._url("/containers/{0}/logs".format(container))
+            url = self._url("/containers/{0}/logs", container)
             res = self._get(url, params=params, stream=stream)
             return self._get_result(container, stream, res)
         return self.attach(
@@ -596,7 +595,7 @@ class Client(clientbase.ClientBase):
 
     @check_resource
     def pause(self, container):
-        url = self._url('/containers/{0}/pause'.format(container))
+        url = self._url('/containers/{0}/pause', container)
         res = self._post(url)
         self._raise_for_status(res)
 
@@ -605,7 +604,7 @@ class Client(clientbase.ClientBase):
 
     @check_resource
     def port(self, container, private_port):
-        res = self._get(self._url("/containers/{0}/json".format(container)))
+        res = self._get(self._url("/containers/{0}/json", container))
         self._raise_for_status(res)
         json_ = res.json()
         s_port = str(private_port)
@@ -692,7 +691,7 @@ class Client(clientbase.ClientBase):
         if not tag:
             repository, tag = utils.parse_repository_tag(repository)
         registry, repo_name = auth.resolve_repository_name(repository)
-        u = self._url("/images/{0}/push".format(repository))
+        u = self._url("/images/{0}/push", repository)
         params = {
             'tag': tag
         }
@@ -725,14 +724,15 @@ class Client(clientbase.ClientBase):
     @check_resource
     def remove_container(self, container, v=False, link=False, force=False):
         params = {'v': v, 'link': link, 'force': force}
-        res = self._delete(self._url("/containers/" + container),
-                           params=params)
+        res = self._delete(
+            self._url("/containers/{0}", container), params=params
+        )
         self._raise_for_status(res)
 
     @check_resource
     def remove_image(self, image, force=False, noprune=False):
         params = {'force': force, 'noprune': noprune}
-        res = self._delete(self._url("/images/" + image), params=params)
+        res = self._delete(self._url("/images/{0}", image), params=params)
         self._raise_for_status(res)
 
     @check_resource
@@ -741,7 +741,7 @@ class Client(clientbase.ClientBase):
             raise errors.InvalidVersion(
                 'rename was only introduced in API version 1.17'
             )
-        url = self._url("/containers/{0}/rename".format(container))
+        url = self._url("/containers/{0}/rename", container)
         params = {'name': name}
         res = self._post(url, params=params)
         self._raise_for_status(res)
@@ -749,21 +749,22 @@ class Client(clientbase.ClientBase):
     @check_resource
     def resize(self, container, height, width):
         params = {'h': height, 'w': width}
-        url = self._url("/containers/{0}/resize".format(container))
+        url = self._url("/containers/{0}/resize", container)
         res = self._post(url, params=params)
         self._raise_for_status(res)
 
     @check_resource
     def restart(self, container, timeout=10):
         params = {'t': timeout}
-        url = self._url("/containers/{0}/restart".format(container))
+        url = self._url("/containers/{0}/restart", container)
         res = self._post(url, params=params)
         self._raise_for_status(res)
 
     def search(self, term):
-        return self._result(self._get(self._url("/images/search"),
-                                      params={'term': term}),
-                            True)
+        return self._result(
+            self._get(self._url("/images/search"), params={'term': term}),
+            True
+        )
 
     @check_resource
     def start(self, container, binds=None, port_bindings=None, lxc_conf=None,
@@ -829,7 +830,7 @@ class Client(clientbase.ClientBase):
                 )
             start_config = self.create_host_config(**start_config_kwargs)
 
-        url = self._url("/containers/{0}/start".format(container))
+        url = self._url("/containers/{0}/start", container)
         res = self._post_json(url, data=start_config)
         self._raise_for_status(res)
 
@@ -839,13 +840,13 @@ class Client(clientbase.ClientBase):
             raise errors.InvalidVersion(
                 'Stats retrieval is not supported in API < 1.17!')
 
-        url = self._url("/containers/{0}/stats".format(container))
+        url = self._url("/containers/{0}/stats", container)
         return self._stream_helper(self._get(url, stream=True), decode=decode)
 
     @check_resource
     def stop(self, container, timeout=10):
         params = {'t': timeout}
-        url = self._url("/containers/{0}/stop".format(container))
+        url = self._url("/containers/{0}/stop", container)
 
         res = self._post(url, params=params,
                          timeout=(timeout + (self.timeout or 0)))
@@ -858,14 +859,14 @@ class Client(clientbase.ClientBase):
             'repo': repository,
             'force': 1 if force else 0
         }
-        url = self._url("/images/{0}/tag".format(image))
+        url = self._url("/images/{0}/tag", image)
         res = self._post(url, params=params)
         self._raise_for_status(res)
         return res.status_code == 201
 
     @check_resource
     def top(self, container):
-        u = self._url("/containers/{0}/top".format(container))
+        u = self._url("/containers/{0}/top", container)
         return self._result(self._get(u), True)
 
     def version(self, api_version=True):
@@ -874,13 +875,13 @@ class Client(clientbase.ClientBase):
 
     @check_resource
     def unpause(self, container):
-        url = self._url('/containers/{0}/unpause'.format(container))
+        url = self._url('/containers/{0}/unpause', container)
         res = self._post(url)
         self._raise_for_status(res)
 
     @check_resource
     def wait(self, container, timeout=None):
-        url = self._url("/containers/{0}/wait".format(container))
+        url = self._url("/containers/{0}/wait", container)
         res = self._post(url, timeout=timeout)
         self._raise_for_status(res)
         json_ = res.json()
diff --git a/docker/clientbase.py b/docker/clientbase.py
index ce52ffa7..90dba63d 100644
--- a/docker/clientbase.py
+++ b/docker/clientbase.py
@@ -88,11 +88,21 @@ class ClientBase(requests.Session):
     def _delete(self, url, **kwargs):
         return self.delete(url, **self._set_request_timeout(kwargs))
 
-    def _url(self, path, versioned_api=True):
+    def _url(self, pathfmt, resource_id=None, versioned_api=True):
+        if resource_id and not isinstance(resource_id, six.string_types):
+            raise ValueError(
+                'Expected a resource ID string but found {0} ({1}) '
+                'instead'.format(resource_id, type(resource_id))
+            )
+        elif resource_id:
+            resource_id = six.moves.urllib.parse.quote_plus(resource_id)
+
         if versioned_api:
-            return '{0}/v{1}{2}'.format(self.base_url, self._version, path)
+            return '{0}/v{1}{2}'.format(
+                self.base_url, self._version, pathfmt.format(resource_id)
+            )
         else:
-            return '{0}{1}'.format(self.base_url, path)
+            return '{0}{1}'.format(self.base_url, pathfmt.format(resource_id))
 
     def _raise_for_status(self, response, explanation=None):
         """Raises stored :class:`APIError`, if one occurred."""
@@ -136,7 +146,7 @@ class ClientBase(requests.Session):
 
     @check_resource
     def _attach_websocket(self, container, params=None):
-        url = self._url("/containers/{0}/attach/ws".format(container))
+        url = self._url("/containers/{0}/attach/ws", container)
         req = requests.Request("POST", url, params=self._attach_params(params))
         full_url = req.prepare().url
         full_url = full_url.replace("http://", "ws://", 1)

Hardening for URL request construction
The `Client` class performs a lot URL construction like this:

        res = self._get(self._url("/exec/{0}/json".format(exec_id)))

This can be used to manipulate the query string if `exec_id` contains characters like `'?'` and `'/'`, which can lead to vulnerabilities elsewhere.  The client code should be fixed to reject such invalid parameters.

Downstream bug report: https://bugzilla.redhat.com/show_bug.cgi?id=1248031
diff --git a/tests/test.py b/tests/test.py
index 1bf8c55d..9cf94a18 100644
--- a/tests/test.py
+++ b/tests/test.py
@@ -144,6 +144,28 @@ class DockerClientTest(Cleanup, base.BaseTestCase):
             'Version parameter must be a string or None. Found float'
         )
 
+    def test_url_valid_resource(self):
+        url = self.client._url('/hello/{0}/world', 'somename')
+        self.assertEqual(
+            url, '{0}{1}'.format(url_prefix, 'hello/somename/world')
+        )
+
+        url = self.client._url('/hello/{0}/world', '/some?name')
+        self.assertEqual(
+            url, '{0}{1}'.format(url_prefix, 'hello/%2Fsome%3Fname/world')
+        )
+
+    def test_url_invalid_resource(self):
+        with pytest.raises(ValueError):
+            self.client._url('/hello/{0}/world', ['sakuya', 'izayoi'])
+
+    def test_url_no_resource(self):
+        url = self.client._url('/simple')
+        self.assertEqual(url, '{0}{1}'.format(url_prefix, 'simple'))
+
+        url = self.client._url('/simple', None)
+        self.assertEqual(url, '{0}{1}'.format(url_prefix, 'simple'))
+
     #########################
     #   INFORMATION TESTS   #
     #########################

pip install -e .[dev]
parse_log_pytest
requirements.txt
pytest pytest-cov
apt-get update apt-get install -y gcc
3.7
requirements.txt
pytest --no-header -rA --tb=line --color=no -p no:cacheprovider -W ignore::DeprecationWarning
certifi @ file:///croot/certifi_1671487769961/work/certifi
coverage==7.2.7
-e git+https://github.com/docker/docker-py.git@33acb9d2e05d0f3abb7897abbe50dd54600da85b#egg=docker_py
exceptiongroup==1.2.2
importlib-metadata==6.7.0
iniconfig==2.0.0
packaging==24.0
pluggy==1.2.0
pytest==7.4.4
pytest-cov==4.1.0
requests==2.5.3
six==1.17.0
tomli==2.0.1
typing_extensions==4.7.1
websocket-client==0.32.0
zipp==3.15.0

name: docker-py
channels:
  - defaults
  - https://repo.anaconda.com/pkgs/main
  - https://repo.anaconda.com/pkgs/r
  - conda-forge
dependencies:
  - _libgcc_mutex=0.1=main
  - _openmp_mutex=5.1=1_gnu
  - ca-certificates=2025.2.25=h06a4308_0
  - certifi=2022.12.7=py37h06a4308_0
  - ld_impl_linux-64=2.40=h12ee557_0
  - libffi=3.4.4=h6a678d5_1
  - libgcc-ng=11.2.0=h1234567_1
  - libgomp=11.2.0=h1234567_1
  - libstdcxx-ng=11.2.0=h1234567_1
  - ncurses=6.4=h6a678d5_0
  - openssl=1.1.1w=h7f8727e_0
  - pip=22.3.1=py37h06a4308_0
  - python=3.7.16=h7a1cb2a_0
  - readline=8.2=h5eee18b_0
  - setuptools=65.6.3=py37h06a4308_0
  - sqlite=3.45.3=h5eee18b_0
  - tk=8.6.14=h39e8969_0
  - wheel=0.38.4=py37h06a4308_0
  - xz=5.6.4=h5eee18b_1
  - zlib=1.2.13=h5eee18b_1
  - pip:
      - coverage==7.2.7
      - exceptiongroup==1.2.2
      - importlib-metadata==6.7.0
      - iniconfig==2.0.0
      - packaging==24.0
      - pluggy==1.2.0
      - pytest==7.4.4
      - pytest-cov==4.1.0
      - requests==2.5.3
      - six==1.17.0
      - tomli==2.0.1
      - typing-extensions==4.7.1
      - websocket-client==0.32.0
      - zipp==3.15.0
prefix: /opt/conda/envs/docker-py

tests/test.py::DockerClientTest::test_url_invalid_resource tests/test.py::DockerClientTest::test_url_no_resource tests/test.py::DockerClientTest::test_url_valid_resource
tests/test.py::DockerClientTest::test_auto_retrieve_server_version tests/test.py::DockerClientTest::test_build_container tests/test.py::DockerClientTest::test_build_container_custom_context tests/test.py::DockerClientTest::test_build_container_custom_context_gzip tests/test.py::DockerClientTest::test_build_container_invalid_container_limits tests/test.py::DockerClientTest::test_build_container_pull tests/test.py::DockerClientTest::test_build_container_stream tests/test.py::DockerClientTest::test_build_container_with_container_limits tests/test.py::DockerClientTest::test_build_container_with_named_dockerfile tests/test.py::DockerClientTest::test_build_remote_with_registry_auth tests/test.py::DockerClientTest::test_commit tests/test.py::DockerClientTest::test_container_stats tests/test.py::DockerClientTest::test_create_container tests/test.py::DockerClientTest::test_create_container_empty_volumes_from tests/test.py::DockerClientTest::test_create_container_privileged tests/test.py::DockerClientTest::test_create_container_with_added_capabilities tests/test.py::DockerClientTest::test_create_container_with_binds tests/test.py::DockerClientTest::test_create_container_with_binds_list tests/test.py::DockerClientTest::test_create_container_with_binds_mode tests/test.py::DockerClientTest::test_create_container_with_binds_mode_and_ro_error tests/test.py::DockerClientTest::test_create_container_with_binds_ro tests/test.py::DockerClientTest::test_create_container_with_binds_rw tests/test.py::DockerClientTest::test_create_container_with_cgroup_parent tests/test.py::DockerClientTest::test_create_container_with_cpu_shares tests/test.py::DockerClientTest::test_create_container_with_cpuset tests/test.py::DockerClientTest::test_create_container_with_devices tests/test.py::DockerClientTest::test_create_container_with_dropped_capabilities tests/test.py::DockerClientTest::test_create_container_with_entrypoint tests/test.py::DockerClientTest::test_create_container_with_labels_dict tests/test.py::DockerClientTest::test_create_container_with_labels_list tests/test.py::DockerClientTest::test_create_container_with_links tests/test.py::DockerClientTest::test_create_container_with_links_as_list_of_tuples tests/test.py::DockerClientTest::test_create_container_with_lxc_conf tests/test.py::DockerClientTest::test_create_container_with_lxc_conf_compat tests/test.py::DockerClientTest::test_create_container_with_mac_address tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_int tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_string tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_string_with_g_unit tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_string_with_k_unit tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_string_with_m_unit tests/test.py::DockerClientTest::test_create_container_with_mem_limit_as_string_with_wrong_value tests/test.py::DockerClientTest::test_create_container_with_multiple_links tests/test.py::DockerClientTest::test_create_container_with_named_volume tests/test.py::DockerClientTest::test_create_container_with_port_binds tests/test.py::DockerClientTest::test_create_container_with_ports tests/test.py::DockerClientTest::test_create_container_with_restart_policy tests/test.py::DockerClientTest::test_create_container_with_stdin_open tests/test.py::DockerClientTest::test_create_container_with_volume_string tests/test.py::DockerClientTest::test_create_container_with_volumes_from tests/test.py::DockerClientTest::test_create_container_with_working_dir tests/test.py::DockerClientTest::test_create_host_config_secopt tests/test.py::DockerClientTest::test_create_named_container tests/test.py::DockerClientTest::test_ctor tests/test.py::DockerClientTest::test_diff tests/test.py::DockerClientTest::test_diff_with_dict_instead_of_id tests/test.py::DockerClientTest::test_events tests/test.py::DockerClientTest::test_events_with_filters tests/test.py::DockerClientTest::test_events_with_since_until tests/test.py::DockerClientTest::test_exec_create tests/test.py::DockerClientTest::test_exec_inspect tests/test.py::DockerClientTest::test_exec_resize tests/test.py::DockerClientTest::test_exec_start tests/test.py::DockerClientTest::test_export tests/test.py::DockerClientTest::test_export_with_dict_instead_of_id tests/test.py::DockerClientTest::test_get_image tests/test.py::DockerClientTest::test_image_history tests/test.py::DockerClientTest::test_image_ids tests/test.py::DockerClientTest::test_image_viz tests/test.py::DockerClientTest::test_images tests/test.py::DockerClientTest::test_images_filters tests/test.py::DockerClientTest::test_images_quiet tests/test.py::DockerClientTest::test_import_image tests/test.py::DockerClientTest::test_import_image_from_bytes tests/test.py::DockerClientTest::test_import_image_from_image tests/test.py::DockerClientTest::test_info tests/test.py::DockerClientTest::test_insert_image tests/test.py::DockerClientTest::test_inspect_container tests/test.py::DockerClientTest::test_inspect_container_undefined_id tests/test.py::DockerClientTest::test_inspect_image tests/test.py::DockerClientTest::test_inspect_image_undefined_id tests/test.py::DockerClientTest::test_kill_container tests/test.py::DockerClientTest::test_kill_container_with_dict_instead_of_id tests/test.py::DockerClientTest::test_kill_container_with_signal tests/test.py::DockerClientTest::test_list_containers tests/test.py::DockerClientTest::test_load_config tests/test.py::DockerClientTest::test_load_config_no_file tests/test.py::DockerClientTest::test_load_config_with_random_name tests/test.py::DockerClientTest::test_load_image tests/test.py::DockerClientTest::test_log_streaming tests/test.py::DockerClientTest::test_log_tail tests/test.py::DockerClientTest::test_log_tty tests/test.py::DockerClientTest::test_logs tests/test.py::DockerClientTest::test_logs_with_dict_instead_of_id tests/test.py::DockerClientTest::test_pause_container tests/test.py::DockerClientTest::test_port tests/test.py::DockerClientTest::test_pull tests/test.py::DockerClientTest::test_pull_stream tests/test.py::DockerClientTest::test_push_image tests/test.py::DockerClientTest::test_push_image_stream tests/test.py::DockerClientTest::test_push_image_with_tag tests/test.py::DockerClientTest::test_remove_container tests/test.py::DockerClientTest::test_remove_container_with_dict_instead_of_id tests/test.py::DockerClientTest::test_remove_image tests/test.py::DockerClientTest::test_remove_link tests/test.py::DockerClientTest::test_rename_container tests/test.py::DockerClientTest::test_resize_container tests/test.py::DockerClientTest::test_restart_container tests/test.py::DockerClientTest::test_restart_container_with_dict_instead_of_id tests/test.py::DockerClientTest::test_retrieve_server_version tests/test.py::DockerClientTest::test_search tests/test.py::DockerClientTest::test_start_container tests/test.py::DockerClientTest::test_start_container_none tests/test.py::DockerClientTest::test_start_container_privileged tests/test.py::DockerClientTest::test_start_container_regression_573 tests/test.py::DockerClientTest::test_start_container_with_binds_ro tests/test.py::DockerClientTest::test_start_container_with_binds_rw tests/test.py::DockerClientTest::test_start_container_with_dict_instead_of_id tests/test.py::DockerClientTest::test_start_container_with_links tests/test.py::DockerClientTest::test_start_container_with_links_as_list_of_tuples tests/test.py::DockerClientTest::test_start_container_with_lxc_conf tests/test.py::DockerClientTest::test_start_container_with_lxc_conf_compat tests/test.py::DockerClientTest::test_start_container_with_multiple_links tests/test.py::DockerClientTest::test_start_container_with_port_binds tests/test.py::DockerClientTest::test_stop_container tests/test.py::DockerClientTest::test_stop_container_with_dict_instead_of_id tests/test.py::DockerClientTest::test_tag_image tests/test.py::DockerClientTest::test_tag_image_force tests/test.py::DockerClientTest::test_tag_image_tag tests/test.py::DockerClientTest::test_tar_with_directory_symlinks tests/test.py::DockerClientTest::test_tar_with_empty_directory tests/test.py::DockerClientTest::test_tar_with_excludes tests/test.py::DockerClientTest::test_tar_with_file_symlinks tests/test.py::DockerClientTest::test_unpause_container tests/test.py::DockerClientTest::test_url_compatibility_http tests/test.py::DockerClientTest::test_url_compatibility_http_unix_triple_slash tests/test.py::DockerClientTest::test_url_compatibility_tcp tests/test.py::DockerClientTest::test_url_compatibility_unix tests/test.py::DockerClientTest::test_url_compatibility_unix_triple_slash tests/test.py::DockerClientTest::test_version tests/test.py::DockerClientTest::test_wait tests/test.py::DockerClientTest::test_wait_with_dict_instead_of_id tests/test.py::StreamTest::test_early_stream_response
docker/client.py docker/clientbase.py
docker/client.py docker/clientbase.py