Docker を使って Assets をビルドする

  • 2
    いいね
  • 0
    コメント

本番サーバ内で Assets のビルドをしたいが、ビルドのためだけに Node.js をインストールしたくない、しかし Docker はインストールされている、というレア(?)な状況に遭遇した際に Docker で Assets のビルドをやってみたのでそのメモ。

$ docker run -it --rm -v $(pwd):/app -w /app node:alpine npm install --unsafe-perm

以下、オプションの細かい解説。

-it

いつものやつ。
今回はなくても問題はないけど一応。

--rm

Assets ビルドのためだけに立ち上げるコンテナでビルドが終わったら不要なため、ビルド後にコンテナを消去するために --rm オプションをつける。

-v $(pwd):/app

ホスト側のカレントディレクトリ (アプリケーションのルート) をコンテナ側の /app にマウントする。

-w /app

コンテナ内でコマンドを実行する際の作業ディレクトリを指定する。

node:alpine

ビルドに使用する Node イメージ。

node:alpine だと最新版の Node イメージが落ちてくるが、例えば Node v6 でビルドしたい場合は node:6-alpine のようにタグを指定する。

詳しくは: library/node - Docker Hub

npm install --unsafe-perm

コンテナで実行するコマンド。

今回は postinstall フックで webpack -p が実行されて Assets がビルドされるように package.json に設定してあったため、 npm install だけでビルドまですることができた。

package.json
  "scripts": {
    "postinstall": "npm run build",
    "build": "webpack -p",
  },

npm install だけだと postinstall: cannot run in wd %s %s (wd=%s) という WARNING が出て postinstall が実行されなかったため、 --unsafe-perm が必要だった。

もし postinstall を使わずに npm installnpm run build を実行したい場合は、実行コマンドを /bin/sh -c 'npm install && npm run build' このようにするといい。