告别 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
创建一个名为index.js的文件。将下面的函数复制并粘贴到其中。
module.exports = () => "Hello Buildpacks!";
使用以下启动脚本更新你的 package.json
"start": "micro"
这就是服务所需的全部内容。运行以下命令创建镜像。
pack build micro --builder paketobuildpacks/builder:base
该命令应该使用构建器创建一个镜像paketobuildpacks/builder:base
。构建器是一个包含执行构建所需的所有组件的镜像。Paketo、Heroku 和其他公司提供了不同的构建器。您甚至可以创建自己的构建器或扩展现有的构建器。
如果您使用 Heroku,那么您的应用在后台会使用 Buildpacks。您可以选择使用 Heroku Buildpacks 构建镜像,以便在部署到 Heroku 或其他平台时使用相同的镜像。
镜像已构建完毕,您可以使用 Docker(或 Podman,如果您使用的是 Podman)运行它来试用。运行下面的 docker 命令来启动应用程序。
docker run -p 3000:3000 -e PORT=3000 micro
在浏览器中访问localhost:3000Hello Buildpacks!
。你应该会收到以下响应。
在 CI/CD 中的使用
您可以在持续集成流水线中使用 Cloud Native Buildpacks 和 pack CLI 构建镜像。GitHub Actions 提供了一个Pack Docker Action供您使用。将其与Docker Login Action 结合使用,您可以在工作流中构建并发布到镜像仓库。如果您使用GitLab 的 Auto DevOps , GitLab 上也有类似的流程。我不会详细介绍如何在不同的 CI 系统中使用 Buildpacks,但您可以查看以下链接:
- 在 GitLab 中使用 Cloud Native Buildpacks 自动构建
- 打包 Docker GitHub Action。可与Docker Login结合使用。
- Tekton Buildpacks任务可在 Tekton Hub 上使用。它不需要 pack CLI 或 Docker。