(Achtung, Rant-Character. Wer das nicht mag findet die Lösung in den letzten 3 Absätzen)
Heute also mal wieder Docker. Ein stetiger Quell an Problemen. Ursprünglich war meine Anforderung gar nicht so kompliziert: Per docker-compose soll eine Multi-Container-Applikation aus- und wieder eingeschaltet werden. Also: docker-compose down
und warten. Leider scheiterte der Prozess bereits an dieser Stelle aufgrund eines Timeouts. Das Schreiben großer Caches beim Beenden benötigt eben seine Zeit. Sicher, es gäbe -t
oder stop_grace_period, aber wie das oft so ist: Wer auch immer vorher damit gearbeitet hat, hat es natürlich nicht dokumentiert oder konfiguriert.
Nunja, der docker-daemon sollte die zugehörigen Container trotz des Timeouts im Frontend noch abarbeiten – entsprechend war nach kurzer Bedenkzeit in docker ps -a
auch kein Container mehr zu sehen, der zur Applikation gehört.
Alles gut? Leider nein. Das folgende docker-compose up
weigerte sich beharrlich die Container wieder zu starten. Es versuchte immer noch, die Überreste der alten Struktur, insbesondere die Netzwerke, zu löschen, und scheiterte:
ERROR: error while removing network: network application_network id XXX has active endpoints
Active? Interessant, denn in docker ps -a
war ja definitiv nichts mehr aktiv. Auch ein manuelles docker network remove application_network
behauptete weiterhin, dass es die ID noch gäbe.
Error response from daemon: error while removing network: network application_network id XXX has active endpoints.
Ein docker network inspect application_network
verriet: Die nicht mehr gelisteten Container sind wohl doch noch da – zumindest so halb. Also gehen wir auf Zombie-Jagd.
Die Lösung: Erst trägt man mit docker network inspect application_network | grep Name
die Namen der verbliebenen Containerreste zusammen. Im Anschluss kann man über docker network disconnect
ein Entfernen erzwingen.
for i in application_db_1 application_es_1 application_redis_1 application_nginx_1 ;do docker network disconnect -f application_network $i ;done
Abschließend entfernt man mit docker network remove application_network
das Netzwerk. Danach sollte einem erneuten Start nichts mehr im Wege stehen.