How to automatically remove duplicate docker networks
docker-compose
based setups with locally mounted volumes have very few common failure modes in practice. The most important ones are system upgrades to docker
stopping all the services and duplicate networks with the same name preventing the startup of a service. Sometimes, docker-compose
does not delete the old network properly, possibly due to unclean or unfinished shutdown procedures.
This will result in log messages such as
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
This simple script will find all duplicate network names and simply delete one of them.
#!/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)
Just call this script without any arguments
python docker-remove-duplicate-networks.py