mirror of
https://github.com/docker/compose.git
synced 2025-07-29 16:44:20 +02:00
Add --all option to rm command - remove one-off containers
Signed-off-by: Joffrey F <joffrey@docker.com>
This commit is contained in:
parent
d5ef0dfa92
commit
187ea4cd81
@ -491,8 +491,12 @@ class TopLevelCommand(object):
|
|||||||
Options:
|
Options:
|
||||||
-f, --force Don't ask to confirm removal
|
-f, --force Don't ask to confirm removal
|
||||||
-v Remove volumes associated with containers
|
-v Remove volumes associated with containers
|
||||||
|
-a, --all Also remove one-off containers
|
||||||
"""
|
"""
|
||||||
all_containers = self.project.containers(service_names=options['SERVICE'], stopped=True)
|
all_containers = self.project.containers(
|
||||||
|
service_names=options['SERVICE'], stopped=True,
|
||||||
|
one_off=(None if options.get('--all') else False)
|
||||||
|
)
|
||||||
stopped_containers = [c for c in all_containers if not c.is_running]
|
stopped_containers = [c for c in all_containers if not c.is_running]
|
||||||
|
|
||||||
if len(stopped_containers) > 0:
|
if len(stopped_containers) > 0:
|
||||||
@ -501,7 +505,8 @@ class TopLevelCommand(object):
|
|||||||
or yesno("Are you sure? [yN] ", default=False):
|
or yesno("Are you sure? [yN] ", default=False):
|
||||||
self.project.remove_stopped(
|
self.project.remove_stopped(
|
||||||
service_names=options['SERVICE'],
|
service_names=options['SERVICE'],
|
||||||
v=options.get('-v', False)
|
v=options.get('-v', False),
|
||||||
|
one_off=options.get('--all')
|
||||||
)
|
)
|
||||||
else:
|
else:
|
||||||
print("No stopped containers")
|
print("No stopped containers")
|
||||||
|
@ -47,10 +47,12 @@ class Project(object):
|
|||||||
self.networks = networks or ProjectNetworks({}, False)
|
self.networks = networks or ProjectNetworks({}, False)
|
||||||
|
|
||||||
def labels(self, one_off=False):
|
def labels(self, one_off=False):
|
||||||
return [
|
labels = ['{0}={1}'.format(LABEL_PROJECT, self.name)]
|
||||||
'{0}={1}'.format(LABEL_PROJECT, self.name),
|
if one_off is not None:
|
||||||
'{0}={1}'.format(LABEL_ONE_OFF, "True" if one_off else "False"),
|
labels.append(
|
||||||
]
|
'{0}={1}'.format(LABEL_ONE_OFF, "True" if one_off else "False")
|
||||||
|
)
|
||||||
|
return labels
|
||||||
|
|
||||||
@classmethod
|
@classmethod
|
||||||
def from_config(cls, name, config_data, client):
|
def from_config(cls, name, config_data, client):
|
||||||
@ -249,8 +251,10 @@ class Project(object):
|
|||||||
def kill(self, service_names=None, **options):
|
def kill(self, service_names=None, **options):
|
||||||
parallel.parallel_kill(self.containers(service_names), options)
|
parallel.parallel_kill(self.containers(service_names), options)
|
||||||
|
|
||||||
def remove_stopped(self, service_names=None, **options):
|
def remove_stopped(self, service_names=None, one_off=False, **options):
|
||||||
parallel.parallel_remove(self.containers(service_names, stopped=True), options)
|
parallel.parallel_remove(self.containers(
|
||||||
|
service_names, stopped=True, one_off=(None if one_off else False)
|
||||||
|
), options)
|
||||||
|
|
||||||
def down(self, remove_image_type, include_volumes, remove_orphans=False):
|
def down(self, remove_image_type, include_volumes, remove_orphans=False):
|
||||||
self.stop()
|
self.stop()
|
||||||
|
@ -17,6 +17,7 @@ Usage: rm [options] [SERVICE...]
|
|||||||
Options:
|
Options:
|
||||||
-f, --force Don't ask to confirm removal
|
-f, --force Don't ask to confirm removal
|
||||||
-v Remove volumes associated with containers
|
-v Remove volumes associated with containers
|
||||||
|
-a, --all Also remove one-off containers
|
||||||
```
|
```
|
||||||
|
|
||||||
Removes stopped service containers.
|
Removes stopped service containers.
|
||||||
|
@ -1125,6 +1125,28 @@ class CLITestCase(DockerClientTestCase):
|
|||||||
self.dispatch(['rm', '-f'], None)
|
self.dispatch(['rm', '-f'], None)
|
||||||
self.assertEqual(len(service.containers(stopped=True)), 0)
|
self.assertEqual(len(service.containers(stopped=True)), 0)
|
||||||
|
|
||||||
|
def test_rm_all(self):
|
||||||
|
service = self.project.get_service('simple')
|
||||||
|
service.create_container(one_off=False)
|
||||||
|
service.create_container(one_off=True)
|
||||||
|
kill_service(service)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True)), 1)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True, one_off=True)), 1)
|
||||||
|
self.dispatch(['rm', '-f'], None)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True)), 0)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True, one_off=True)), 1)
|
||||||
|
self.dispatch(['rm', '-f', '-a'], None)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True, one_off=True)), 0)
|
||||||
|
|
||||||
|
service.create_container(one_off=False)
|
||||||
|
service.create_container(one_off=True)
|
||||||
|
kill_service(service)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True)), 1)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True, one_off=True)), 1)
|
||||||
|
self.dispatch(['rm', '-f', '--all'], None)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True)), 0)
|
||||||
|
self.assertEqual(len(service.containers(stopped=True, one_off=True)), 0)
|
||||||
|
|
||||||
def test_stop(self):
|
def test_stop(self):
|
||||||
self.dispatch(['up', '-d'], None)
|
self.dispatch(['up', '-d'], None)
|
||||||
service = self.project.get_service('simple')
|
service = self.project.get_service('simple')
|
||||||
|
Loading…
x
Reference in New Issue
Block a user