Ich mag es nicht, Volumes als Link zu einem Hostverzeichnis einzubinden, also habe ich ein Muster entwickelt, um Docker-Container mit ausschließlich von Docker verwalteten Containern zu aktualisieren. Das Erstellen eines neuen Docker-Containers mit --volumes-from
gibt dem neuen Container mit den aktualisierten Images eine gemeinsame Verwaltung von den von Docker verwalteten Volumes.
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
Indem du das ursprüngliche my_mysql_container
noch nicht sofort entfernst, hast du die Möglichkeit, zum bekannten funktionierenden Container zurückzukehren, falls der aktualisierte Container nicht über die richtigen Daten verfügt oder einen Funktionstest nicht besteht.
An diesem Punkt führe ich normalerweise die Sicherungsskripte für den Container aus, um mir im Falle eines Fehlers ein Sicherheitsnetz zu geben
docker stop my_mysql_container
docker start my_mysql_container_tmp
Jetzt hast du die Möglichkeit sicherzustellen, dass die Daten, die du im neuen Container erwartest, vorhanden sind, und einen Funktionscheck durchzuführen.
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
Die Docker-Volumes bleiben bestehen, solange irgendein Container sie verwendet, daher kannst du den ursprünglichen Container sicher löschen. Sobald der ursprüngliche Container entfernt ist, kann der neue Container den Namen des ursprünglichen übernehmen, um alles so hübsch zu machen wie zu Beginn.
Es gibt zwei Hauptvorteile bei der Verwendung dieses Musters zur Aktualisierung von Docker-Containern. Erstens eliminiert es die Notwendigkeit, Volumes an Hostverzeichnisse zu binden, indem es Volumes direkt auf aktualisierte Container überträgt. Zweitens gerätst du nie in die Situation, dass kein funktionierender Docker-Container vorhanden ist; also wenn das Update fehlschlägt, kannst du leicht zur vorherigen Arbeitsweise zurückkehren, indem du den ursprünglichen Docker-Container erneut startest.