调用docker命令行从python中删除所有容器

调用docker命令行从python中删除所有容器,python,Python,我正在尝试移植: 到python脚本。到目前为止,我已经: def remove_all_containers(): subprocess.call(['docker', 'stop','$(docker ps -a -q)']) subprocess.call(['docker', 'rm','$(docker ps -a -q)']) return; 但是你可以得到: Error response from daemon: No such container:

我正在尝试移植:

到python脚本。到目前为止,我已经:

def remove_all_containers():
    subprocess.call(['docker', 'stop','$(docker ps -a -q)'])
    subprocess.call(['docker', 'rm','$(docker ps -a -q)'])  
    return;
但是你可以得到:

Error response from daemon: No such container: $(docker ps -a -q)
我也尝试过:

def remove_all_containers():
    subprocess.call(['docker', 'stop',$(docker ps -a -q)])
    subprocess.call(['docker', 'rm',$(docker ps -a -q)])
    return;
但这给了:

    subprocess.call(['docker', 'stop',$(docker ps -a -q)])
SyntaxError: invalid syntax

似乎我需要将另一个子流程调用嵌套到父子流程调用中。或者有没有更简单的方法;DR:命令替换
$(…)
是一个shell功能,因此必须在shell上运行命令:

subprocess.call('docker stop $(docker ps -a -q)', shell=True)
subprocess.call('docker rm $(docker ps -a -q)', shell=True)

其他改进:

这不是必需的,但我建议使用(或
run(…,check=True)
,请参见下文)而不是,以便在发生错误时不会被忽略:

subprocess.check_call('docker stop $(docker ps -a -q)', shell=True)
subprocess.check_call('docker rm $(docker ps -a -q)', shell=True)
您还可以走另一条路:解析
docker ps-a-q的输出,然后传递到
stop
rm

container_ids = subprocess.check_output(['docker', 'ps', '-aq'], encoding='ascii')
container_ids = container_ids.strip().split()
if container_ids:
    subprocess.check_call(['docker', 'stop'] + container_ids])
    subprocess.check_call(['docker', 'rm'] + container_ids])
如果您使用的是Python 3.5+,还可以使用更新的函数:

# With shell
subprocess.run('docker stop $(docker ps -a -q)', shell=True, check=True)
subprocess.run('docker rm $(docker ps -a -q)', shell=True, check=True)

# Without shell
proc = subprocess.run(['docker', 'ps', '-aq'], check=True, stdout=PIPE, encoding='ascii')
container_ids = proc.stdout.strip().split()
if container_ids:
    subprocess.run(['docker', 'stop'] + container_ids], check=True)
    subprocess.run(['docker', 'rm'] + container_ids], check=True)

有一个很好的python官方库,可以帮助Docker。

我们已收到所有容器并将其移除,无论容器状态是否为“已启动”。 如果可以将库导入到代码中,它可能会很有用。

您使用的是$(shell功能),而不是通过shell调用。
import docker
client = docker.DockerClient(Config.DOCKER_BASE_URL) 
docker_containers = client.containers.list(all=True)
for dc in docker_containers:
   dc.remove(force=True)