From 6b59dc62715a1e387543de02ade80de84aa2171c Mon Sep 17 00:00:00 2001 From: David Steines Date: Mon, 3 Apr 2017 21:58:59 -0400 Subject: [PATCH] Allow detach and remove for api version >= 1.25 and use auto_remove when both are set. Continue raising an exception for api versions <1.25. Signed-off-by: David Steines --- docker/models/containers.py | 10 ++++++++-- tests/unit/models_containers_test.py | 30 ++++++++++++++++++++++++++++ 2 files changed, 38 insertions(+), 2 deletions(-) diff --git a/docker/models/containers.py b/docker/models/containers.py index a3598f28..d9db79df 100644 --- a/docker/models/containers.py +++ b/docker/models/containers.py @@ -4,6 +4,7 @@ from ..api import APIClient from ..errors import (ContainerError, ImageNotFound, create_unexpected_kwargs_error) from ..types import HostConfig +from ..utils import compare_version from .images import Image from .resource import Collection, Model @@ -690,8 +691,12 @@ class ContainerCollection(Collection): image = image.id detach = kwargs.pop("detach", False) if detach and remove: - raise RuntimeError("The options 'detach' and 'remove' cannot be " - "used together.") + if compare_version("1.24", + self.client.api._version) > 0: + kwargs["auto_remove"] = True + else: + raise RuntimeError("The options 'detach' and 'remove' cannot " + "be used together in api versions < 1.25.") if kwargs.get('network') and kwargs.get('network_mode'): raise RuntimeError( @@ -849,6 +854,7 @@ RUN_CREATE_KWARGS = [ # kwargs to copy straight from run to host_config RUN_HOST_CONFIG_KWARGS = [ + 'auto_remove', 'blkio_weight_device', 'blkio_weight', 'cap_add', diff --git a/tests/unit/models_containers_test.py b/tests/unit/models_containers_test.py index 70c86480..5eaa45ac 100644 --- a/tests/unit/models_containers_test.py +++ b/tests/unit/models_containers_test.py @@ -273,9 +273,39 @@ class ContainerCollectionTest(unittest.TestCase): client.api.remove_container.assert_called_with(FAKE_CONTAINER_ID) client = make_fake_client() + client.api._version = '1.24' with self.assertRaises(RuntimeError): client.containers.run("alpine", detach=True, remove=True) + client = make_fake_client() + client.api._version = '1.23' + with self.assertRaises(RuntimeError): + client.containers.run("alpine", detach=True, remove=True) + + client = make_fake_client() + client.api._version = '1.25' + client.containers.run("alpine", detach=True, remove=True) + client.api.remove_container.assert_not_called() + client.api.create_container.assert_called_with( + command=None, + image='alpine', + detach=True, + host_config={'AutoRemove': True, + 'NetworkMode': 'default'} + ) + + client = make_fake_client() + client.api._version = '1.26' + client.containers.run("alpine", detach=True, remove=True) + client.api.remove_container.assert_not_called() + client.api.create_container.assert_called_with( + command=None, + image='alpine', + detach=True, + host_config={'AutoRemove': True, + 'NetworkMode': 'default'} + ) + def test_create(self): client = make_fake_client() container = client.containers.create(