---
title: Cloud Native Buildpacks Tutorial - 2.1. ┗ gcr.io/paketo-buildpacks/builder:base BuilderでNodeJSアプリのOCIイメージを作成
tags: ["Cloud Native Buildpacks Tutorial", "Cloud Native Buildpacks", "Paketo", "Series"]
categories: ["Dev", "Infrastructure", "CloudNativeBuildpacks", "Paketo"]
date: 2020-04-28T07:20:33Z
updated: 2020-05-11T03:30:58Z
---

`gcr.io/paketo-buildpacks/builder:base`でNodeJSのアプリケーションのOCIイメージを作成します。

BuilderとStackを予めpullしておいてください。

```
docker pull gcr.io/paketo-buildpacks/builder:base
docker pull gcr.io/paketo-buildpacks/run:base-cnb
```

次のコマンドで"Hello World"アプリケーションを作成します。

```
mkdir hello-nodejs
cd hello-nodejs
cat <<'EOF' > package.json
{
  "name": "hello-nodejs",
  "version": "1.0.0",
  "description": "",
  "main": "app.js",
  "scripts": {
    "start": "node app.js"
  },
  "keywords": [],
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.17.1"
  }
}
EOF
cat <<'EOF' > app.js
const express = require('express')
const app = express()
const port = 8080

app.get('/', (req, res) => res.send('Hello World!'))

app.listen(port, () => console.log(`Example app listening at http://localhost:${port}`))
EOF
```

`pack build`コマンドでイメージを作成します。

```
pack build making/pack-nodejs --no-pull --builder gcr.io/paketo-buildpacks/builder:base
```

> BuilderとStackを事前にpullしていない場合は`--no-pull`を外せば、ビルド時にBuilderとStackもpullしますが、ビルドが遅くなります。

次のようなログが出力されます。

```
===> DETECTING
[detector] paketo-buildpacks/node-engine 0.0.178
[detector] paketo-buildpacks/npm         0.1.11
===> ANALYZING
[analyzer] Previous image with name "index.docker.io/making/pack-nodejs:latest" not found
===> RESTORING
===> BUILDING
[builder] Node Engine Buildpack 0.0.178
[builder]   Resolving Node Engine version
[builder]     Candidate version sources (in priority order):
[builder]        -> "*"
[builder] 
[builder]     Selected Node Engine version (using ): 10.19.0
[builder] 
[builder]   Executing build process
[builder]     Installing Node Engine 10.19.0
[builder]       Completed in 1.078s
[builder] 
[builder]   Configuring environment
[builder]     NODE_ENV     -> "production"
[builder]     NODE_HOME    -> "/layers/paketo-buildpacks_node-engine/node"
[builder]     NODE_VERBOSE -> "false"
[builder] 
[builder]     Writing profile.d/0_memory_available.sh
[builder]       Calculates available memory based on container limits at launch time.
[builder]       Made available in the MEMORY_AVAILABLE environment variable.
[builder] 
[builder] NPM Buildpack 0.1.11
[builder]   Resolving installation process
[builder]     Process inputs:
[builder]       node_modules      -> "Not found"
[builder]       npm-cache         -> "Not found"
[builder]       package-lock.json -> "Not found"
[builder] 
[builder]     Selected NPM build process: 'npm install'
[builder] 
[builder]     Running 'npm install'
[builder]   Executing build process
[builder]       Completed in 2.143s
[builder] 
[builder]   Configuring environment
[builder]     NPM_CONFIG_LOGLEVEL   -> "error"
[builder]     NPM_CONFIG_PRODUCTION -> "true"
[builder]     PATH                  -> "$PATH:/layers/paketo-buildpacks_npm/modules/node_modules/.bin"
===> EXPORTING
[exporter] Adding layer 'launcher'
[exporter] Adding layer 'paketo-buildpacks/node-engine:node'
[exporter] Adding layer 'paketo-buildpacks/npm:modules'
[exporter] Adding 1/1 app layer(s)
[exporter] Adding layer 'config'
[exporter] *** Images (dcc2faf283cb):
[exporter]       index.docker.io/making/pack-nodejs:latest
[exporter] Adding cache layer 'paketo-buildpacks/node-engine:node'
[exporter] Adding cache layer 'paketo-buildpacks/npm:npm-cache'
Successfully built image making/pack-nodejs
```

> `pack build`時に`--publish`オプションをつけると、Docker Registryでのpushを行います。事前に`docker login`が必要です。

作成したイメージを`docker run`で起動します。

```
docker run --rm -p 8080:8080 making/pack-nodejs
```

アプリケーションにアクセスします。

```
$ curl localhost:8080 -w '\n'
Hello World!
```

Docker Imageのサイズを確認します。

```
$ docker images | grep making/pack-nodejs
making/pack-nodejs                   latest              dcc2faf283cb        40 years ago        142MB
```

`pack inspect-image`でイメージを解析します。

```
$ pack inspect-image making/pack-nodejs
Inspecting image: making/pack-nodejs

REMOTE:
(not present)

LOCAL:

Stack: io.buildpacks.stacks.bionic

Base Image:
  Reference: 40845d52d6fb6d285a320aeac821b61cff0e2863e0ff12e12138c4775aae1828
  Top Layer: sha256:f0d87426c0a82340475d73a9108b063d3d3cfbd92ef3b4af74dcd8f904475a36

Run Images:
  gcr.io/paketo-buildpacks/run:base-cnb

Buildpacks:
  ID                                   VERSION
  paketo-buildpacks/node-engine        0.0.178
  paketo-buildpacks/npm                0.1.11

Processes:
  TYPE                 SHELL        COMMAND          ARGS
  web (default)        bash         npm start   
```

NodeJS Buildpackの細かい設定は
https://github.com/paketo-buildpacks/nodejs
を確認してください。

おわったらDocker Imageを削除します。

```
docker rmi making/pack-nodejs
```
