warning
この記事は2年以上前に更新されたものです。情報が古くなっている可能性があります。

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の細かい設定は

を確認してください。

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

docker rmi making/pack-nodejs
Found a mistake? Update the entry.
Share this article: