--- title: Cloud Native Buildpacks Tutorial - 5.1. ┗ heroku/buildpacks:18 BuilderでNodeJSアプリのOCIイメージを作成 tags: ["Cloud Native Buildpacks Tutorial", "Cloud Native Buildpacks", "Heroku", "Series"] categories: ["Dev", "Infrastructure", "CloudNativeBuildpacks", "Heroku"] date: 2020-04-28T09:53:11Z updated: 2020-05-11T03:34:48Z --- `heroku/buildpacks:18`でNodeJSのアプリケーションのOCIイメージを作成します。 BuilderとStackを予めpullしておいてください。 ``` docker pull heroku/buildpacks:18 docker pull heroku/pack:18 ``` 次のコマンドで"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 heroku/buildpacks:18 ``` > BuilderとStackを事前にpullしていない場合は`--no-pull`を外せば、ビルド時にBuilderとStackもpullしますが、ビルドが遅くなります。 次のようなログが出力されます。 ``` ===> DETECTING [detector] heroku/nodejs-engine 0.4.3 [detector] heroku/nodejs-npm 0.1.4 [detector] heroku/procfile 0.5 ===> ANALYZING [analyzer] Warning: Image "index.docker.io/making/pack-nodejs:latest" not found ===> RESTORING ===> BUILDING [builder] ---> Node.js Buildpack [builder] ---> Installing toolbox [builder] ---> - jq [builder] ---> - yj [builder] ---> Getting Node version [builder] ---> Resolving Node version [builder] ---> Downloading and extracting Node v12.16.2 [builder] ---> Parsing package.json [builder] ---> No file to start server [builder] ---> either use 'docker run' to start container or add index.js or server.js [builder] ---> Using npm v6.14.4 from Node [builder] ---> Installing node modules [builder] npm WARN hello-nodejs@1.0.0 No description [builder] npm WARN hello-nodejs@1.0.0 No repository field. [builder] [builder] added 50 packages from 37 contributors and audited 126 packages in 1.603s [builder] found 0 vulnerabilities [builder] [builder] -----> Discovering process types [builder] Procfile declares types -> (none) ===> EXPORTING [exporter] Adding layer 'launcher' [exporter] Adding layer 'heroku/nodejs-engine:nodejs' [exporter] Adding 1/1 app layer(s) [exporter] Adding layer 'config' [exporter] *** Images (c2b3f6fd3656): [exporter] index.docker.io/making/pack-nodejs:latest [exporter] Adding cache layer 'heroku/nodejs-engine:nodejs' [exporter] Adding cache layer 'heroku/nodejs-engine:toolbox' 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 c2b3f6fd3656 40 years ago 577MB ``` `pack inspect-image`でイメージを解析します。 ``` $ pack inspect-image making/pack-nodejs Inspecting image: making/pack-nodejs REMOTE: (not present) LOCAL: Stack: heroku-18 Base Image: Reference: 60f9e03398de7d6a5268be95224246f05eed9f1eecb1fe7605753261f2bd871a Top Layer: sha256:ceefbd5b67bc32a9d87867c8c8d375675246e9db9b470cb95133b4e93429b113 Run Images: heroku/pack:18 Buildpacks: ID VERSION heroku/nodejs-engine 0.4.3 heroku/nodejs-npm 0.1.4 heroku/procfile 0.5 Processes: TYPE SHELL COMMAND ARGS web (default) bash npm start ``` NodeJS Buildpackの細かい設定は * https://github.com/heroku/nodejs-engine-buildpack * https://github.com/heroku/nodejs-npm-buildpack * https://github.com/heroku/nodejs-yarn-buildpack を確認してください。 おわったらDocker Imageを削除します。 ``` docker rmi making/pack-nodejs ```