Вы отметили это "производство".Стандартный способ, которым я это сделал, выглядит следующим образом:
Разработка локально без Docker.Пройдите все свои юнит-тесты.Соберите и запустите контейнер локально и запустите интеграционные тесты.
Создайте «официальную» версию контейнера.Пометьте его отметкой времени, номером версии или тегом контроля версий;но не пометьте его :latest
или именем ветви или чем-либо еще, что со временем изменится.
docker push
встроенный образ в реестр.
В производственной системе измените конфигурацию развертывания, указав только что созданный тег версии.В некотором порядке docker run
контейнер (или более) с новым изображением и docker stop
контейнер (ы) со старым изображением.
Когда все идет не так,измените конфигурацию развертывания обратно на предыдущую версию и повторно разверните ее.(... упс.) Если старые версии образов еще не находятся в локальной системе, их можно извлечь из реестра.
При необходимости docker rm
старые контейнерыи docker rmi
старых изображений.
Как правило, многое из этого может быть автоматизировано.Система непрерывной интеграции может создавать программное обеспечение, запускать тесты и передавать встроенные артефакты в реестр;Менеджеры кластеров, такие как Kubernetes или Docker Swarm, способны хранить некоторое количество копий какой-либо версии контейнера, работающей где-то, и управлять процессом обновления версии для вас.(В частности, Kubernetes Deployments запустит копию нового образа перед тем, как начать закрывать старые; службы Kubernetes предоставляют балансировщики нагрузки для этой работы.)
Ничто из этого не относится к Node.Что касается системы развертывания, то нигде нет файлов .js
, только образы Docker.(Вы не копируете свои исходные файлы отдельно от изображений или не привязываете к исходному дереву исходное дерево поверх содержимого изображения, и вы определенно не пытаетесь в реальном времени исправить патч работающего контейнера.) После неудачного возврата на шаге 5, вы можете запустить именно неудачную конфигурацию в непроизводственной среде, чтобы увидеть, что пошло не так.
Но да, по сути, вам нужно удалить старый контейнер со старым образом и запустить новый контейнер с новымизображение.