Мені не подобається монтажу томів як посилання на хост-каталог, тому я придумав схему оновлення контейнерів docker контейнерами, повністю керованими докерами. Створення нового контейнера докера з --volumes-from <container>
дасть новий контейнер з оновленими зображеннями, що мають спільне володіння томами, керованими докер.
docker pull mysql
docker create --volumes-from my_mysql_container [...] --name my_mysql_container_tmp mysql
Не відразу видаляючи оригінал my_mysql_container
, ви маєте можливість повернутись до відомого робочого контейнера, якщо оновлений контейнер не має потрібних даних або не виконаний тест на безпечність.
У цей момент я зазвичай запускаю будь-які сценарії резервного копіювання для контейнера, щоб забезпечити собі безпечну мережу, якщо щось піде не так
docker stop my_mysql_container
docker start my_mysql_container_tmp
Тепер у вас є можливість переконатися в наявності даних, які ви очікуєте у новому контейнері, і запустити санітарну перевірку.
docker rm my_mysql_container
docker rename my_mysql_container_tmp my_mysql_container
Томи докера будуть триматися навколо тих пір, поки будь-який контейнер використовує їх, тому ви можете безпечно видалити оригінальний контейнер. Після видалення оригінального контейнера новий контейнер може припустити тезку оригіналу, щоб зробити все таким же гарним, як і слід було почати.
Існує дві основні переваги використання цього шаблону для оновлення докерних контейнерів. По-перше, це виключає необхідність монтажу томів для розміщення каталогів, дозволяючи томи безпосередньо переноситися на оновлені контейнери. По-друге, ви ніколи не знаходитесь у становищі, де немає робочого докерного контейнера; тому якщо оновлення не вдалося, ви можете легко повернутися до того, як воно працювало раніше, знову відкрутивши оригінальний контейнер докера.