告别 Dockerfiles:使用 Cloud Native Buildpacks 构建安全且优化的 Node.js 容器镜像

2025-06-07

告别 Dockerfiles:使用 Cloud Native Buildpacks 构建安全且优化的 Node.js 容器镜像

Docker 使开发人员能够轻松地打包、共享和运行应用程序。作为一个平台,它塑造了我们构建和运行应用程序的方式,容器已成为运行应用程序的事实标准。容器镜像是一个轻量级、独立、可执行的软件包,包含运行应用程序所需的一切:代码、运行时、系统库和设置。您需要一个Dockerfile来创建镜像。

当你通过执行命令告诉 Docker(或任何类似工具)构建镜像时docker build,它会读取 Dockerfile 中的指令,执行它们,并最终创建一个镜像。编写 Dockerfile 是一回事,而编写针对快速构建和输出镜像的安全优化的 Dockerfile 又是另一回事。如果不小心,你可能会创建需要很长时间才能构建的镜像。除了构建镜像所需的时间之外,它们也可能不安全。

当然,您可以学习如何保护和优化容器镜像!但是,您难道不想把时间和资源投入到编写代码上,而将创建优化镜像的任务委托给其他工具吗?这正是 Cloud Native Buildpacks 可以提供帮助的地方。

什么是云原生构建包?

云原生构建包 (Cloud Native Buildpacks) 是可插拔的模块化工具,可将应用程序源代码转换为容器镜像。它的作用是收集应用程序构建和运行所需的一切。除了其他优势之外,它们还可以在应用程序开发生命周期中取代 Dockerfile,支持快速镜像变基,并提供对镜像的模块化控制(通过使用构建器)。

它们是如何工作的?

构建包会检查您的应用,以确定其所需的依赖项以及如何运行,然后将其全部打包为可运行的容器镜像。通常,您会通过一个或多个构建包来运行源代码。每个构建包都会经历两个阶段:检测阶段和构建阶段。

检测阶段会针对您的源代码运行,以确定某个 buildpack 是否适用。如果检测到该 buildpack 适用,则进入构建阶段。如果项目未通过检测,则跳过该特定 buildpack 的构建阶段。

构建阶段会根据您的源代码运行,以下载依赖项并编译源代码(如果需要),并设置适当的入口点和启动脚本。让我们看看如何使用pack CLI创建镜像

构建您的第一个图像

您将使用 pack CLI 构建您的第一个镜像。前往buildpacks.io/docs/tools/pack,并按照您操作系统的说明进行安装。您将创建并部署一个返回字符串的 Node.js Web 应用。

运行以下命令创建项目并安装micro(用于构建微服务的 HTTP 库)

mkdir micro-app && cd micro-app && npm init -y && npm i micro
Enter fullscreen mode Exit fullscreen mode

创建一个名为index.js的文件。将下面的函数复制并粘贴到其中。

module.exports = () => "Hello Buildpacks!";
Enter fullscreen mode Exit fullscreen mode

使用以下启动脚本更新你的 package.json

"start": "micro"
Enter fullscreen mode Exit fullscreen mode

这就是服务所需的全部内容。运行以下命令创建镜像。

pack build micro --builder paketobuildpacks/builder:base
Enter fullscreen mode Exit fullscreen mode

该命令应该使用构建器创建一个镜像paketobuildpacks/builder:base构建器是一个包含执行构建所需的所有组件的镜像。Paketo、Heroku 和其他公司提供了不同的构建器。您甚至可以创建自己的构建器或扩展现有的构建器。

如果您使用 Heroku,那么您的应用在后台会使用 Buildpacks。您可以选择使用 Heroku Buildpacks 构建镜像,以便在部署到 Heroku 或其他平台时使用相同的镜像。

镜像已构建完毕,您可以使用 Docker(或 Podman,如果您使用的是 Podman)运行它来试用。运行下面的 docker 命令来启动应用程序。

docker run -p 3000:3000 -e PORT=3000 micro
Enter fullscreen mode Exit fullscreen mode

在浏览器中访问localhost:3000Hello Buildpacks! 。你应该会收到以下响应。

在 CI/CD 中的使用

您可以在持续集成流水线中使用 Cloud Native Buildpacks 和 pack CLI 构建镜像。GitHub Actions 提供了一个Pack Docker Action供您使用。将其与Docker Login Action 结合使用,您可以在工作流中构建并发布到镜像仓库。如果您使用GitLab 的 Auto DevOps , GitLab 上也有类似的流程。我不会详细介绍如何在不同的 CI 系统中使用 Buildpacks,但您可以查看以下链接:

文章来源:https://dev.to/pmbanugo/goodbye-dockerfiles-build-secure-optimized-nodejs-container-images-with-cloud-native-buildpacks-489p
PREV
十分钟内从 Java 8 升级到 Java 15 函数式编程 (Java 8) Streams (Java 8) Optional (Java 8) JShell (Java 9) 不可变集合的工厂方法 (Java 9) 使用 var 进行类型推断 (Java 10) 单源文件启动 (Java 11) Switch 表达式 (Java 12) 多行字符串 (Java 13) 数据类:record (Java 14) 不带强制类型转换的实例 (Java 14) 密封类 (Java 15) 额外奖励:从 Java 8 开始更新许可条款 总结
NEXT
缅怀斯科特·艾伦 000——与斯科特·艾伦的对话