This topic tells you how to use the Tanzu Node.js Buildpack.
The Tanzu Node.js Buildpack supports several popular configurations for Node.js apps.
The Node Engine Cloud Native Buildpack (CNB) allows you to specify a version of Node.js to use during deployment. You can specify the version in a number of ways, but you must choose a version that is available within the buildpack.
The buildpack prioritizes the versions specified in each possible configuration location with the following precedence, from highest to lowest: BP_NODE_VERSION
, package.json
, .nvmrc
and .node-version
.
BP_NODE_VERSION
To configure the buildpack to use, for example, Node.js v12.12.0 when deploying your app, set the following environment variable at build time. You can either set it directly by configuring the spec.build.env
field on Tanzu Application Platform, or set it through a project.toml file.
For example:
BP_NODE_VERSION="12.12.0"
package.json
If your apps use npm
or yarn
, you can specify the Node.js version your apps use during deployment by configuring the engines
field in the package.json
file. For example, to configure the buildpack to use Node.js v12.12.0 when deploying your app, include the values below in your package.json
file:
{
"engines": {
"node": "12.12.0"
}
}
For more information about the engines
configuration option in the package.json
file, see the NPM documentation.
Node Version Manager is a common option for managing the Node.js version an app uses. To specify the Node.js version your apps use during deployment, include a .nvmrc
file with the version number. For more information about the contents of a .nvmrc
file, see .nvmrc in the Node Version Manager repository on GitHub.
.node-version
is another common option that is compatible with Node.js version managers such as asdf
and nodenv
. You can use a .node-version
file to set the Node.js version that your apps use during deployment, according to one of the following formats:
12.12.0
OR
v12.12.0
OR
12.12
Node.js limits the total size of all objects on the heap. Enabling the optimize-memory
feature sets this value to three-quarters of the total memory available in the container. For example, if your app is limited to 1 GB when pushed, the heap of your Node.js app is limited to 768 MB.
To enable memory optimization, set BP_NODE_OPTIMIZE_MEMORY
environment variable to true
during build.
To specify a subdirectory to be used as the root of the app, set the BP_NODE_PROJECT_PATH
environment variable at build time either directly or through a project.toml
. This could be useful if your app is a part of a monorepo.
For example, if your project has the following structure:
.
├── go-app
│ ├── go.mod
│ └── main.go
└── node-app
├── file.js
├── index.js
└── package.json
you could then set the following at build time:
$BP_NODE_PROJECT_PATH=node-app
To specify scripts inside package.json
you would like to execute, please use the BP_NODE_RUN_SCRIPTS
environment variable at build time either directly or through a project.toml
. The value of the variable should be a comma separated list of script names listed in the app's package.json
Many Node.js apps require a number of third-party libraries to perform common tasks and behaviors. NPM is an option for managing these third-party dependencies that the Node.js CNB fully supports. Including a package.json
file in your app source code triggers the NPM installation process. The sections below describe the NPM installation process run by the buildpack.
NPM supports several distinct methods for installing your package dependencies. Specifically, the Node.js CNB runs either the npm install, npm rebuild, or npm ci commands to build your app with the right set of dependencies. When deciding which installation process to use, the Node.js CNB consults your app source code, looking for the presence of specific files or directories. The installation process used also determines how the Node.js CNB will reuse layers when rebuilding your app.
The following table shows the process the Node.js CNB uses to determine an installation process for NPM packages. When a combination of the files and directories listed in the table below are present in your app source code, the Node.js CNB uses an installation process that ensures the correct third-party dependencies are installed during the build process.
package-lock.json |
node_modules |
npm-cache |
Command |
---|---|---|---|
X | X | X | npm install |
X | X | ✓ | npm install |
X | ✓ | X | npm rebuild |
X | ✓ | ✓ | npm rebuild |
✓ | X | X | npm ci |
✓ | X | ✓ | npm ci |
✓ | ✓ | X | npm rebuild |
✓ | ✓ | ✓ | npm ci |
The following sections give more information about the files listed in the table above, including how to generate them, if desired.
The package-lock.json
file is generated by running npm install
. For more information, see the NPM documentation.
The node_modules
directory contains vendored copies of all the packages installed by the npm install
process. For more information, see the NPM documentation.
The npm-cache
directory contains a content-addressable cache that stores all HTTP request and package-related data. Additionally, including a cache ensures that the app can be built entirely offline.
To populate an npm-cache
directory:
Navigate to your source code directory.
Run:
npm ci --cache npm-cache
For more information about the NPM cache, see the NPM documentation.
To improve build times for apps, the Node.js CNB has a method for reusing the build results from previous builds. When the CNB determines that a portion of the build process can be reused from a previous build, the CNB uses the previous result. Each installation process uses a different method for determining whether the CNB can reuse a previous build result.
For npm install
, the CNB never reuses a node_modules
directory from previous builds.
For npm rebuild
, the CNB can reuse a node_modules
directory from a previous build if the included node_modules
directory in the app source code has not changed since the prior build.
For npm ci
, the CNB can reuse a node_modules
directory from a previous build if the package-lock.json
file included in the app source code has not changed since the prior build.
As part of the build process, the Node.js CNB determines a start command for your app. The start command differs depending on which package management tooling the Node.js CNB uses. If the Node.js CNB uses npm
to install packages, the start command is npm start
.
Many Node.js apps require a number of third-party libraries to perform common tasks and behaviors. Yarn is an alternative option to NPM for managing these third-party dependencies. Including package.json
and yarn.lock
files in your app source code triggers the Yarn installation process.
The Node.js CNB runs yarn install
and yarn check
to ensure that third-party dependencies are properly installed. The yarn.lock
file contains a fully resolved set of package dependencies that Yarn manages. For more information, see the Yarn documentation.
As part of the build process, the Node.js CNB determines a start command for your app. The start command differs depending on which package management tooling the Node.js CNB uses. If the Node.js CNB uses yarn
to install packages, the start command is yarn start
.
The Node.js buildpack supports building apps without node_modules
or a package.json
. It will detect this type of app automatically, by looking for one of these four files in the root of your application directory:
server.js
app.js
main.js
index.js
If your app's entrypoint file is not one of the four files named above, you can specify a different file name (or path) by setting the BP_LAUNCHPOINT
environment variable at build time.
BP_LAUNCHPOINT
BP_LAUNCHPOINT
can be set as follows:
BP_LAUNCHPOINT="./src/launchpoint.js"
The image produced by the build runs node src/launchpoint.js
as its start command.
If you are using a framework that generates a static site from JavaScript source code (e.g. React, Vue, Angular), you can use the Tanzu Web Servers buildpack to build the static assets and automatically configure a web server.
By default, your Node.js server will be the only process running in your app container at runtime. You can enable restarting the server process when files in the app's working directory change, which may facilitate a shorter feedback loop for iterating on code changes.
BP_LIVE_RELOAD_ENABLED
To enable reloadable processes, set the $BP_LIVE_RELOAD_ENABLED
environment variable at build time. For more information, see the Paketo documentation.
The Node.js Buildpack runs fine on the Base builder for most apps. If your app requires compilation of native extensions using node-gyp
, the buildpack requires that you use the Full builder. This is because node-gyp
requires python
which is excluded from the the Base builder, and the module may require other shared objects.
You can configure the Node.js buildpack using service bindings.
type |
Required Files | # Bindings of This Type Accepted |
---|---|---|
npmrc |
type , .npmrc |
0 or 1 |
yarnrc |
type , .yarnrc |
0 or 1 |
.npmrc
Adding an .npmrc
file in your app's working directory will allow you to provide project-level npm
configuration.
.npmrc
You might prefer not to include an .npmrc
file in your source code and app image, for example, if an .npmrc
contains credentials for connecting to a private registry. You can provide the .npmrc
by using a service binding whose type
is npmrc
. The binding must contain a file called .npmrc
. The Node.js Buildpack sets this binding as the [NPM_CONFIG_GLOBALCONFIG
][npmrc/precedence] in the build environment.
To pack build
with the binding:
pack build myapp --env SERVICE_BINDING_ROOT=/bindings --volume <absolute-path-to-binding-dir>:/bindings/npmrc
.yarnrc
Adding an .yarnrc
file in your app's working directory will allow you to provide project-level yarn
configuration.
.yarnrc
You might prefer not to include an .yarnrc
file in your source code and app image. You can provide the .yarnrc
by using a service binding whose type
is yarnrc
. The binding must contain a file called .yarnrc
. The Node.js Buildpack will set this binding as the user-level .yarnrc
in the build environment. It will not be present in the launch environment.
To pack build
with the binding:
pack build myapp --env SERVICE_BINDING_ROOT=/bindings --volume <absolute-path-to-binding-dir>:/bindings/yarnrc
Node.js buildpack users can provide their own CA certificates and have them included in the container root truststore at build-time and runtime by following the instructions outlined in the CA Certificates section of our configuration docs.
Node.js buildpack users can set custom start processes for their app image by following the instructions in the Procfiles section of our configuration docs.
Node.js buildpack users can embed launch-time environment variables in their app image by following the documentation for the Environment Variables Buildpack.
Node.js buildpack users can add labels to their app image by following the instructions in the Applying Custom Labels section of our configuration docs.
This section demonstrates building the Paketo NPM samples app on different platforms.
For an example NPM app that can be built by the Node.js buildpack, see the Paketo samples repository.
To build an app using Tanzu Application Platform:
Create a workload.yaml
.
---
apiVersion: carto.run/v1alpha1
kind: Workload
metadata:
labels:
app.kubernetes.io/part-of: npm-sample
apps.tanzu.vmware.com/has-tests: "true"
apps.tanzu.vmware.com/workload-type: web
name: npm-sample
spec:
params:
- name: ports
value:
- port: 80
containerPort: 8000
name: http
source:
git:
ref:
branch: main
url: https://github.com/paketo-buildpacks/samples
subPath: nodejs/npm
Where metadata.name
is the application name the workload is a part of, and spec.source.git
points to the remote source code.
Trigger an image build in the my-apps
namespace by running:
tanzu apps workload apply --file workload.yaml --namespace my-apps
After the build completes, you can view the result by running:
tanzu apps workload get npm-sample --namespace my-apps
The Node.js buildpack is available in both the full
and lite
descriptors for Tanzu Build Service. Use kp image create
to create an image resource. For more information, see the Tanzu Build Service documentation
For instructions for how to build the sample app using pack
, see the paketo-buildpacks README in GitHub.
The Node.js buildpack sets a number of environment variables during the build
and launch
phases of the app lifecycle. The sections below describe each environment variable and its impact on your app.
The MEMORY_AVAILABLE
environment variable reports the total amount of memory available to the app. The Node.js CNB calculates this value from the $VCAP_APPLICATION
settings or the limits specified by the operating system in /sys/fs/cgroup/memory/memory.limit_in_bytes
.
profile.d
launch
The NODE_ENV
environment variable specifies the environment in which the app runs.
node-engine
buildpackbuild
The NODE_HOME
environment variable sets the path to the node
installation.
node-engine
buildpackbuild
node
installationThe NODE_VERBOSE
environment variable adjusts the amount of logging output from NPM during installs.
node-engine
buildpackbuild
The NPM_CONFIG_LOGLEVEL
environment variable adjusts the level of logging NPM uses.
npm-install
buildpackbuild
The NPM_CONFIG_PRODUCTION
environment variable installs only production dependencies if NPM install is used.
npm-install
buildpackbuild
The node_modules/.bin
directory is appended onto the PATH
environment variable.
yarn-install
or npm-install
buildpacksbuild
node_modules/.bin
directory