问题描述
我构建了自己的 docker 镜像并在 Heroku 上运行它们。这很好用,这是一个示例 Docker 文件:
FROM node:14-alpine
workdir /app
copY ./ncc/web ./
CMD node ./index.js
问题是我还想在运行 node.js 时使用 Jemalloc 来更好地管理内存。过去我在使用普通节点 dynos(不是 docker 图像)时使用过这个 Jemalloc buildpack,并且效果很好:
https://github.com/gaffneyc/heroku-buildpack-jemalloc
如果我理解正确,但是 buildpacks 和 docker 图像不兼容?所以这个 buildpack 不会自动从我的图像中获得?
有没有办法让 buildpack 在我的镜像中运行?
如果没有,有谁知道我将如何在我的实例中安装和使用 jemalloc?
解决方法
我认为 Cloud Native Buildpacks 正是您所需要的。 Cloud Native Buildpacks 生成 Docker 映像作为输出,这意味着您甚至不需要 Dockerfile
。
heroku/buildpacks:18
CNB 构建器映像包含 heroku/nodejs
构建包。但是您需要手动添加 jemalloc buildpack。由于 jemalloc 是旧式构建包(即不是 Cloud Naitve),您需要使用 CNB shim。通过这种方式,您可以使用以下 URL 引用 buildpack:
https://buildpack-registry.heroku.com/cnb/gaffneyc/jemalloc
综上所述,安装 Pack CLI 后,您应该能够运行:
$ pack build --builder heroku/buildpacks:18 --buildpack heroku/nodejs,https://buildpack-registry.heroku.com/cnb/gaffneyc/jemalloc my app