如何升级NodeJS Docker容器?

时间:2019-04-14 13:42:30

标签: node.js docker npm

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

如何使NodeJS服务器保持最新状态?

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

2 个答案:

答案 0 :(得分:0)

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

处理docker映像的软件包和更新的最佳方法是使用所有更新创建单独的标签。所有新更新的单独标签使您可以在发生向后兼容性问题时进行回滚。

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

答案 1 :(得分:0)

[UPDATE]-基于OP的评论

要从Docker获取最新图像,然后通过以下过程进行部署,可以使用DockerHub API(基于Registry HTTP API)来查询图像标签。然后找到您使用的图像(“高山”,“超薄”或“任意”)并获取最新的标签。之后,运行您的测试管道并将该标签注册为部署候选人

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等)将包含所有这些步骤。并且,理想会在每次提交时运行:

静态分析

首先,使用短毛绒(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)注册新代码之前,管道应该运行分析,测试和其他重要任务。