Cloud Native Buildpacks Tutorial - 2.1. ┗ gcr.io/paketo-buildpacks/builder:base BuilderでNodeJSアプリのOCIイメージを作成
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