本番サーバ内で 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
だけでビルドまですることができた。
"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 install
と npm run build
を実行したい場合は、実行コマンドを /bin/sh -c 'npm install && npm run build'
このようにするといい。