Nie lubię montować woluminów jako łącza do katalogu hosta, więc wymyśliłem wzorzec uaktualniania kontenerów dokowanych z kontenerami zarządzanymi całkowicie przez dokerów. Utworzenie nowego kontenera dokowanego za pomocą --volumes-from <container>
spowoduje, że nowy kontener ze zaktualizowanymi obrazami będzie współwłasnością woluminów zarządzanych przez dokera.
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
Nie usuwając my_mysql_container
jeszcze oryginału , możesz wrócić do znanego działającego kontenera, jeśli zmodernizowany kontener nie ma odpowiednich danych lub nie przejdzie testu zdrowego rozsądku.
W tym momencie zwykle uruchamiam wszystkie skrypty tworzenia kopii zapasowych, które mam dla kontenera, aby zapewnić sobie siatkę bezpieczeństwa na wypadek, gdyby coś poszło nie tak
docker stop my_mysql_container
docker start my_mysql_container_tmp
Teraz masz możliwość upewnienia się, że dane, które mają znajdować się w nowym kontenerze, znajdują się na miejscu i przeprowadzenia kontroli poczytalności.
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
Woluminy dokowania będą się trzymać tak długo, jak długo będzie z nich korzystać dowolny pojemnik, dzięki czemu można bezpiecznie usunąć oryginalny pojemnik. Po usunięciu oryginalnego pojemnika nowy pojemnik może przyjąć nazwę oryginału, aby wszystko było tak ładne, jak miało się rozpocząć.
Istnieją dwie główne zalety używania tego wzorca do aktualizacji kontenerów dokerów. Po pierwsze, eliminuje potrzebę montowania woluminów w katalogach hosta, umożliwiając bezpośrednie przenoszenie woluminów do zmodernizowanych kontenerów. Po drugie, nigdy nie jesteś w pozycji, w której nie ma działającego kontenera dokowanego; więc jeśli aktualizacja się nie powiedzie, możesz łatwo powrócić do poprzedniego stanu, ponownie rozpinając oryginalny pojemnik dokowania.