Node / Docker是node-sass没有找到安装的绑定(通过Webpack)

时间:2018-03-06 19:53:33

标签: node.js docker webpack-dev-server node-sass webpack-style-loader

我很难在基于node:latest

的docker容器中设置webpack dev服务器

尽管在Node Sass could not find a binding for your current environment中尝试了各种各样的咒语,但我仍然遇到同样的错误:

web_1         | ERROR in ./~/css-loader!./~/sass-loader/lib/loader.js!./src/sass/style.sass
web_1         | Module build failed: Error: Missing binding /prject/node_modules/node-sass/vendor/linux-x64-59/binding.node
web_1         | Node Sass could not find a binding for your current environment: Linux 64-bit with Node.js 9.x
web

这是当前的

# Dockerfile
RUN yarn cache clean && yarn install --non-interactive --force
RUN rm -rf node_modules/node_sass
RUN npm rebuild node-sass

重建步骤表明二进制已安装并检出:

Binary found at /advocate/node_modules/node-sass/vendor/linux-x64-59/binding.node
Testing binary
Binary is fine

同样令我困惑的是,我确实得到了这个

web_1         | Found bindings for the following environments:
web_1         |   - OS X 64-bit with Node.js 7.x

这让我觉得它正在以某种身份使用主机平台我并不完全遵循。

1 个答案:

答案 0 :(得分:5)

node_modules目录的状态正从开发主机进入容器。在npm/yarn install期间(通常是使用本机代码的模块)进行基于平台的决策时,这是一个问题。

Dockerfile build

node_modules添加到您的.dockerignore文件中。容器中的安装需要更长的时间,但是你的开发环境和容器之间永远不会有任何交叉。

已安装的开发卷

使用node_modules将开发代码挂载到容器中也会导致同样的问题。在使用它之前在新平台上运行yarn install --force通常应足以将其切换回来。

安装卷时,忽略目录并不是一种简单的方法。您可以单独挂载项目中的每个目录/文件,然后忽略node_modules,但这需要做很多工作。

同步开发卷

这是避免装载卷的方法。 docker-syncrsync strategy可以忽略文件。这也可能会加速一些具有大量文件访问模式的应用程序。从osx>安装的卷上文件访问速度很慢vm>泊坞窗。

version: '2'

options:
  verbose: true

syncs:
  yourproject_data:
    sync_strategy: 'rsync'
    src: './'
    sync_host_port: 10872
    sync_args: '-v' 
    sync_excludes:
      - '.sass-cache/'
      - 'sass-cache/'
      - 'vendor/'
      - 'bower_components/'
      - 'node_modules/'
      - '.git/'

默认情况下,文件删除不会同步到容器,您需要将其考虑在内。当我需要清理东西时,偶尔会删除同步的卷。