【发布时间】:2019-04-17 02:31:40
【问题描述】:
我有一个基于官方node Docker 镜像的 NodeJS 镜像,在生产环境中运行。
如何让 NodeJS 服务器保持最新?
- 我如何知道重建和重新部署 docker 映像的时间或频率? (我希望它始终保持最新状态)
- 如何使 Docker 映像中的
npm包保持最新?
【问题讨论】:
我有一个基于官方node Docker 镜像的 NodeJS 镜像,在生产环境中运行。
如何让 NodeJS 服务器保持最新?
npm 包保持最新?【问题讨论】:
您可以使用 jenkins 安排在所需时间间隔创建 nodejs 图像的作业。
处理 docker 镜像的包和更新的最佳方式是为所有更新创建单独的标签。所有新更新的单独标签使您能够在出现任何向后兼容性问题时回滚。
如果您想实现持续交付,请使用此新映像创建您的应用程序映像并始终运行测试套件。
【讨论】:
[更新] - 基于 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)注册新代码之前,管道应该运行分析、测试和其他重要任务
【讨论】:
node 映像的容器,我想知道如何使容器保持最新(即,每次出现 node 映像的新版本时可能都要重建它在 Docker 集线器上)。我不清楚每次发布新的node 图像时如何自动升级/重建容器。 (这是我问题的前半部分)