vue-cliで Cannot find module 'chalk' と言われてnpm run buildが通らない

めちゃはまり

事象

dockerつかってvue-cliからbuildしようとしたとき、chalkがnotfoundで落ちる。

下記DockerFileから抜粋

ENV NODE_ENV=production

WORKDIR /usr/local/app-octface-front
RUN npm install

RUN npm run build

RUN npm run build で下記エラーが出る。

Step 14/18 : RUN npm run build
 ---> Running in bd96983db14f

> oct-face@1.0.0 build /usr/local/app-octface-front
> node build/build.js

internal/modules/cjs/loader.js:583
    throw err;
    ^

Error: Cannot find module 'chalk'
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:581:15)
    at Function.Module._load (internal/modules/cjs/loader.js:507:25)
    at Module.require (internal/modules/cjs/loader.js:637:17)
    at require (internal/modules/cjs/helpers.js:20:18)
    at Object.<anonymous> (/usr/local/app-octface-front/build/check-versions.js:2:15)
    at Module._compile (internal/modules/cjs/loader.js:689:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:700:10)
    at Module.load (internal/modules/cjs/loader.js:599:32)
    at tryModuleLoad (internal/modules/cjs/loader.js:538:12)
    at Function.Module._load (internal/modules/cjs/loader.js:530:3)

package.jsonには chalk があるがインストール後の現物を見るとnode_modules配下に確かにディレクトリがない。おかしい。

一時解決

原因は、package.jsonにchalkなどがdevDependencies で 記述されており、npm installNODE_ENV=production だったのでインストールされなかったようだ。 ENV NODE_ENV=production を、npm install後になるように書き直した。

RUN npm install

ENV NODE_ENV=production
RUN npm run build

根本的に、vue-cliによって生成されたbuild.jsがビルドサーバーで動かないつくりになってるのは違和感。 多分開発で使っていたソースをそのままぶっこむのは何か違うんじゃないかな。試すの面倒くさいから誰か見てほしい。