Docker节点构build – 巴贝尔预设和深层模块错误

在parsing了几个额外的babel预设(我的npm脚本创build的)之后,然后unknown plugin "add-module-exports" in /node_modules/react-dropzone/.babelrc了一个unknown plugin "add-module-exports" in /node_modules/react-dropzone/.babelrc ,现在我遇到了一个要求npm rebuild node-sass --force

此外,webpack需要花费很长时间,3-4分钟。

我有一种感觉,无论是我的node_module文件夹或环境没有正确设置在这里。 我目前的设置是否做了一些愚蠢的事情?

.babelrc

 { "compact": false, "presets": [ "es2015", "es2015-loose", "stage-2", "stage-1", "stage-0", "react" ], "env": { "test": { "plugins": ["transform-es2015-modules-commonjs"] } } } 

Dockerfile:

 FROM node:7.7.3 RUN npm install -g pm2 babel-cli # Useful for reloading npm install if package json changed ADD package.json /tmp/package.json RUN cd /tmp && npm install RUN mkdir -p /usr/src/app && cp -a /tmp/node_modules /usr/src/app COPY . /usr/src/app WORKDIR /usr/src/app ADD .babelrc server.js index.js /usr/src/app/ CMD ["pm2", "start", "./index.js", "--no-daemon"] EXPOSE 2020 

泊坞窗,compose.yml

 doc: build: . ports: - "2020:2020" volumes: - .:/usr/src/app/ - /usr/src/app/node_modules 

./index.js

 require('babel-register'); require('./server.js'); 

./server.js

 var express = require('express'); var path = require('path'); const isDeveloping = process.env.NODE_ENV !== 'production'; const PORT = isDeveloping ? 2020 : 2020; // process.env.PORT - docker? const app = express(); if (isDeveloping) { let webpack = require('webpack'); let webpackMiddleware = require('webpack-dev-middleware'); let webpackHotMiddleware = require('webpack-hot-middleware'); let config = require('./webpack.prod.config.js'); const compiler = webpack(config); const middleware = webpackMiddleware(compiler, { publicPath: config.output.publicPath, noInfo: true, quiet: false, lazy: false, watchOptions: { aggregateTimeout: 300, poll: true }, stats: { colors: true, } }); const bundlePath = path.join(__dirname, './dist/index.html'); app.use(middleware); app.use(webpackHotMiddleware(compiler)); app.get('*', function response(req, res) { res.write(middleware.fileSystem.readFileSync(bundlePath)); res.end(); }); } else { console.log(process.env.NODE_ENV) const staticPath = path.join(__dirname, 'dist') app.use(express.static(staticPath)); } app.listen(PORT) console.log('Open up http://localhost:' + PORT); 

你的configuration是好的,从你所performance的,我想。

现在遇到了对npm重buildnode-sass –force的要求

你有一个.dockerignore文件设置在你的项目文件夹? 如果不是,则添加一个,并在该文件中包含node_modules 。 它与.gitignore格式相同。

https://docs.docker.com/engine/reference/builder/#dockerignore-file

我的想法是,您错误地将您的主机操作系统的node_modules文件夹复制到Docker映像中。 npm install过程不会取代它,因为它看到包已经在那里。

通过添加.dockerignore并告诉它不要复制node_modules文件夹,您将强制docker映像安装模块。 这样, node-sass模块(需要本地生成)将被正确编译。

webpack花了很长时间build立,3-4分钟。

你在Mac吗? Docker有一个已知的问题,硬盘驱动器的访问速度要比原生驱动器的访问速度慢很多,甚至在Linux上也是如此。

Windows并不像Mac那么糟糕,但它还是比Linux更糟糕。

对于这个问题你可以做的事情不多,不幸的是,几乎没有什么。 您已经在使用node_modules文件夹的卷…您可以尝试将卷添加到webpack构build内容的临时文件夹中,但是只能获得25%的性能提升。