【问题标题】:How to upgrade a NodeJS Docker container?如何升级 NodeJS Docker 容器?
【发布时间】:2019-04-17 02:31:40
【问题描述】:

我有一个基于官方node Docker 镜像的 NodeJS 镜像,在生产环境中运行。

如何让 NodeJS 服务器保持最新?

  • 我如何知道重建和重新部署 docker 映像的时间或频率? (我希望它始终保持最新状态)
  • 如何使 Docker 映像中的 npm 包保持最新?

【问题讨论】:

    标签: node.js docker npm


    【解决方案1】:

    您可以使用 jenkins 安排在所需时间间隔创建 nodejs 图像的作业。

    处理 docker 镜像的包和更新的最佳方式是为所有更新创建单独的标签。所有新更新的单独标签使您能够在出现任何向后兼容性问题时回滚。

    如果您想实现持续交付,请使用此新映像创建您的应用程序映像并始终运行测试套件。

    【讨论】:

      【解决方案2】:

      [更新] - 基于 OP 的 cmets

      要从 Docker 获取最新的镜像,然后通过以下流程部署它们,您可以使用 DockerHub API(基于 Registry HTTP API)来查询镜像的标签。然后找到您使用的图像(Alpine、Slim、Whatever)并使用它的最新标签。在此之后,运行您的测试管道并将该标记注册为部署候选者

      TOKEN=//curl https://hub.docker.com/v2/users/login with credentials
      REPO="node"
      USERNAME="MyDockerHubUsername"    
      TAGS=$(curl -H "Authorization: JWT ${TOKEN}" https://hub.docker.com/v2/repositories/${USERNAME}/${REPO}/tags/)
      

      您的问题看似简单。实际上,让生产映像保持最新需要的不仅仅是在某个时间间隔更新映像。要实现图像的真正 CI/CD,您需要在每次更新时运行一系列步骤。

      成功的管道(Jenkins、Bamboo、CircleCi、CodePipeline 等)将包含所有这些步骤。并且,理想情况下会在每次提交时运行:

      静态分析

      首先,使用 linter (eslint) 和一些代码覆盖率指标分析您的代码。我不会说什么被认为是可接受的覆盖范围,因为这在很大程度上是基于意见的,但至少应该有一定数量的覆盖范围。

      测试(单位)

      使用 Karma/Mocha/Cucumber 之类的工具对您的代码运行单元测试。

      构建

      现在您可以构建 Docker 映像了。我更喜欢像 Hashicorp's Packer 这样的工具来构建图像。 由于我假设您正在容器中运行节点服务器(Express 或类似的东西),因此您可能还希望启动容器并在此阶段之后运行一些本地验收测试。

      注册

      在您接受容器的本地测试后,将镜像注册到您使用的任何服务(ECR、Dockerhub、Nexus)并以某种有意义的方式对其进行标记。

      部署

      现在您有了一个正常工作的容器,您需要将它部署到您的编排环境中。这可能是 Kubernetes、Docker Swarm、AWS ECS 或其他。不过,重要的是您还没有向该容器提供流量。

      测试(集成)

      随着容器在有意义的测试环境(非产品、阶段、测试等)中运行,您现在可以针对它运行集成测试。这些将检查以确保它可以与数据层连接,或者会寻找大量出现的 500/400 错误。

      不要忘记 - 安全性也应该始终是您测试的一部分。这是一个很好的地方

      切换

      现在您已经在非生产环境中进行了测试,您可以部署到生产环境或将路由切换到您刚刚测试过的常设容器。在这里,您应该决定是使用绿/蓝还是 A/B 部署。如果是蓝色/绿色,则开始将所有流量路由到新容器。如果是 A/B,则根据某个比率设置路由策略。无论您使用哪种方法,请确保您了解可接受的故障率。监控新部署是否有任何故障(500 个错误代码或您认为重要的任何内容),并确保您能够在出现问题时快速回滚到旧容器。

      接受

      在没有缺陷的情况下经过足够长的时间后,您可以接受新容器作为稳定的候选者。重新标记图像,或将图像标记保存在某处,并标明它是“稳定的”,并使其成为新的实际图像以进行启动。

      频率

      现在回答“多久一次”。频率是良好迭代开发的副作用。如果您的代码更改在大小和范围上受到限制,那么只要代码通过测试,您就应该对启动充满信心。因此,通过强大的 DevOps 实践,您将能够在代码提交到存储库时部署新映像。这可能是一天一次、两次或五十次。这个数字最终会变得任意。

      使 NPM 包保持最新

      这取决于您使用的软件包。对于公共包,您可能希望限制为某个版本。然后创建管道,在沙盒环境中测试这些包的某些版本,然后再允许它们进入您的环境。

      对于私有包,请确保每个包都有一个管道。在向 npm 或您的私有存储库(例如 Nexus)注册新代码之前,管道应该运行分析、测试和其他重要任务

      【讨论】:

      • 谢谢,但您正在描述将新版本投入生产的过程,不是吗?我感兴趣的是让 NodeJS 服务器保持最新状态(以避免在 NodeJS.org 发布补丁后出现第一天漏洞)。 NPM 也是如此。换句话说,我们的代码不会经常更改,但底层的 NodeJS 服务器会。例如,在物理机上,我会执行“sudo apt-get upgrade; npm update”。
      • 要扩展帖子,您还可以在 cron 上运行管道,这将确保服务器是最新的。然后您将每天发布,并在代码更改时发布。
      • 除非你问,“我如何部署独立于代码的 docker 镜像”。 IE。服务器映像的部署和代码更改的部署。我不建议你这样做。两者在功能上相互依赖,其中一个的变化总是有能力破坏另一个
      • 我觉得还是有误会。鉴于我已经有一个基于官方 node 映像的容器,我想知道如何使容器保持最新(即,每次出现 node 映像的新版本时可能都要重建它在 Docker 集线器上)。我不清楚每次发布新的node 图像时如何自动升级/重建容器。 (这是我问题的前半部分)
      • 好的,我想我明白了。您可以使用 Registry API 从 dockerhub 中提取图像标签。我更新了顶部的帖子以显示如何
      猜你喜欢
      • 2017-04-21
      • 2014-12-31
      • 2021-09-19
      • 2021-06-17
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多