如何自动删除重复的 docker 网络

基于 docker-compose 且使用本地挂载卷的设置在实践中很少有常见的故障模式。最重要的故障模式是 docker 系统升级停止所有服务以及同名的重复网络阻止服务启动。有时,docker-compose 没有正确删除旧网络,可能是由于不干净或未完成的关闭过程。

这将导致类似以下的日志消息

docker_network_log_excerpt.txt
May 22 21:52:15 myserver docker-compose[2384642]: Removing network etherpad-mydomain_default
May 22 21:52:15 myserver docker-compose[2384642]: network etherpad-mydomain_default is ambiguous (2 matches found based on name)
May 22 21:52:16 myserver systemd[1]: etherpad-mydomain.service: Control process exited, code=exited, status=1/FAILURE

这个简单的脚本将找到所有重复的网络名称并简单地删除其中一个。

docker_remove_duplicate_networks.py
#!/usr/bin/env python3
import subprocess
import json

already_seen_networks = set()

output = subprocess.check_output(["docker", "network", "ls", "--format", "{{json .}}"])
for line in output.decode("utf-8").split("\n"):
    line = line.strip()
    if not line: continue
    obj = json.loads(line.strip())
    id = obj["ID"]
    name = obj["Name"]
    if name in already_seen_networks:
        print(f"Detected duplicate network {name}. Removing duplicate network {id}...")
        subprocess.check_output(["docker", "network", "rm", id])

    already_seen_networks.add(name)

只需不带任何参数调用此脚本

run_docker_remove_duplicate_networks.sh
python docker-remove-duplicate-networks.py

Check out similar posts by category: Docker, Python