为什么我的webpack捆绑包成功构建在主机上,却不在docker容器中?

尤斯

我的项目有一个monorepo结构,如下所示:

babel.config.js
  a-something
  b-something

我的项目的根目录中有babel config文件,以及程序包a-somethingb-something内包装中,a-something我有以下webpack配置:

const path = require('path')

module.exports = {
  target: 'node',
  entry: './src/index.js',
  output: {
    filename: 'bundle.js',
    path: path.resolve(__dirname, 'build')
  },
  devtool: 'source-map',
  module: {
    rules: [
      {
        test: /\.js?$/,
        use: {
          loader: 'babel-loader',
          options: {
            rootMode: 'upward'
          }
        },
        include: [
          path.resolve(__dirname, 'src'),
          /node_modules\/a-/,
          /node_modules\/b-/
        ]
      }
    ]
  }
}

在包中,a-something我有以下package.json:

{
  "name": "a-something",
  "version": "1.0.0",
  "description": "",
  "main": "index.js",
  "scripts": {
    "prod:build": "webpack --config webpack.config.js",
    "prod:start": "node build/bundle.js"
  },
  "author": "",
  "license": "ISC",
  "dependencies": {
    "express": "^4.16.2",
    "graphql": "^14.5.8",
    "graphql-request": "^1.8.2",
    "graphql-tag": "^2.10.1",
    "b-something": "^1.0.0",
    "node-fetch": "^2.6.0",
    "sitemap": "^5.0.0"
  },
  "devDependencies": {
    "webpack": "3.5.6",
    "@babel/polyfill": "7.7.0"
  }
}

我的根package.json具有以下依赖关系:

"@babel/cli": "^7.5.5",
"@babel/core": "^7.5.5",
"babel-loader": "8.0.6"

最后,我的Dockerfile内部包a-something是:

FROM node:10.15.1
COPY ./package.json /src/package.json
ENV PORT 3000
ENV NODE_ENV production
WORKDIR /src
RUN npm install
COPY ./lerna.json /src/lerna.json
COPY ./packages/a-something/package.json /src/packages/a-something/package.json
COPY ./packages/b-something/package.json /src/packages/b-something/package.json
RUN npm run clean
COPY . /src
WORKDIR /src/packages/a-something
RUN npm run prod:build
RUN echo "FINISHED BUILDING!" 
EXPOSE ${PORT}
CMD ["npm" , "run", "prod:start"]

当我运行npm run prod: buildnpm run prod: start成功构建捆绑包时,但是当我构建docker(上下文是根文件夹)时,出现以下npm错误:

ERROR in Entry module not found: Error: Can't resolve 'babel-loader' in '/src/packages/a-something'
npm ERR! code ELIFECYCLE
npm ERR! errno 2
npm ERR! [email protected] prod:build: `webpack --config webpack.config.js`
npm ERR! Exit status 2
npm ERR! 
npm ERR! Failed at the [email protected] prod:build script.

我的主机操作系统是macOS Mojave。也许Lerna生成的符号链接在Debian(由node image使用上的处理方式有所不同


更新:通过将所有与babel相关的npm软件包从移动devDependenciesdependencies根package.json的部分中,解决了该问题有谁知道为什么这可以解决问题?

尤斯

正如我在问题的更新部分中提到的那样,解决方案是将所有与babel相关的软件包移动到devDependencies根package.json的部分。

但是为什么这有帮助呢?

问题是我设置NODE_ENV为在Dockerfile中生产。如果设置为生产,npm将不会安装dev依赖项NODE_ENV在主机上,我没有这样的变量。@babel/polyfill根据babel docs的说法,另外还有一个问题

因为这是一个polyfill(它将在您的源代码之前运行),所以我们需要它是一个依赖项,而不是devDependency

根据文档 @babel/polyfill,也已弃用,因此更好的解决方案是:

  1. 添加"babel-loader": "8.0.6"到根package.json
  2. devDependenciesa-somethingpackage.json中具有以下内容
    "devDependencies": {
        "webpack": "3.5.6",
        "core-js": "^3.4.7",
        "regenerator-runtime": "^0.13.3"
      }
  1. 将这两行放在最上方的条目Javascript文件中:
import 'core-js/stable'
import 'regenerator-runtime/runtime'
  1. 最后使用此webpack配置:
    const path = require('path')

    module.exports = {
      target: 'node',
      entry: './src/index.js',
      output: {
        filename: 'bundle.js',
        path: path.resolve(__dirname, 'build')
      },
      module: {
        rules: [
          {
            test: /\.js?$/,
            use: {
              loader: 'babel-loader',
              options: {
                rootMode: 'upward',
                presets: [
                  ['@babel/preset-env', {
                    corejs: 3,
                    useBuiltIns: 'usage'
                  }]
                ]
              }
            },
            include: [
              path.resolve(__dirname, 'src'),
                /node_modules\/a-/,
                /node_modules\/b-/
            ]
          }
        ]
      }
    }

本文收集自互联网,转载请注明来源。

如有侵权,请联系 [email protected] 删除。

编辑于
0

我来说两句

0 条评论
登录 后参与评论

相关文章

为什么这个程序在容器中运行而不在主机上运行?

我如何访问在docker容器(由Rancher管理)中运行的MySQL,而不在主机上发布端口?

无法在远程主机上构建Docker容器

gitlab CI构建在我的本地docker容器上运行

为什么我从Docker容器中退出?

为什么 docker 主机上的 Jenkins 响应来自容器内部的 HTTP 请求?

我的应用程序(在Docker容器中)如何访问MongoDb(在我的主机上)?

为什么此功能在我的主机上不能很好地工作,而在虚拟机上却不能工作?(GetPhysicalInstalledSystemMemory)

我如何才能找出为什么成功的 kubernetes MountVolume 步骤不会导致 docker 容器中的任何挂载?

为什么构建在 cominterfaces.tlh 中显示错误

Prometheus(在Docker容器中)无法在主机上擦除目标

Jar在主机上运行,但在Docker容器中失败

Docker不在主机上为Mac上的容器打开端口

为什么Docker(Dind)容器中的Docker使用主机路径装载卷?

Docker和Webpack捆绑包在本地生成但不在容器中生成

“ Dockerized”应用程序经常构建在OS容器之上。为什么这不会破坏目的?

我如何动态链接到由docker容器中的主机上运行的udev创建的设备的符号链接

为什么docker容器中的shell会显示主机中的dmesg内容?

Docker在容器中侦听但不在外部应答,为什么?

为什么我的脚本不在容器中创建新元素?

Docker如何将卷从Docker Client挂载到在Docker主机上运行的Docker容器中?

在主机上挂载开发Docker容器目录

docker容器无法在主机上写入

Docker容器无法在主机上写入

docker容器数据存储在主机上的哪里?

Docker:从容器访问主机上的服务

Docker在单个主机上扩展容器

无法联系Windows主机上的Docker容器

为什么我的跨度不在主容器的中间