【问题标题】:Dockerfile - Error: Cannot find module 'react'Dockerfile - 错误:找不到模块\'react\'
【发布时间】:2022-12-01 01:07:24
【问题描述】:

我有一个正在尝试 Dockerize 的 React 应用程序。这是我的 Dockerfile 和 docker-compose:

FROM node:16.13.1
WORKDIR /app

ENV PATH /app/node_modules/.bin:$PATH

COPY package.json .
COPY package-lock.json .

RUN mkdir -p node_modules/node-sass/vendor/linux-x64-93
RUN curl -L https://github.com/sass/node-sass/releases/download/v7.0.1/linux-x64-93_binding.node -o node_modules/node-sass/vendor/linux-x64-93/binding.node

RUN npm install -g npm@9.1.2
RUN npm install react-scripts@5.0.0 -g
RUN npm rebuild node-sass

COPY . .

EXPOSE 3000

CMD \["npm", "start"\]
version: "3.8"
services:
  web-cnss:
    build: './editor'
    ports: [ "3000:3000" ]
    container_name: WEB-CNSS
    volumes:
      - '/app/node_modules'

我需要以某种方式指定 npm 版本并安装 react-scripts,否则它会在另一台计算机上出错。 除此之外,在我的电脑上一切正常,但是,我的目标是任何人都可以克隆我的项目并通过简单地运行“docker-compose up”来构建它。

我在同事的电脑上测试了一下,是这样的错误:

Error: Cannot find module 'react'
WEB-CNSS     | Require stack:
WEB-CNSS     | - /usr/local/lib/node_modules/react-scripts/scripts/start.js
WEB-CNSS     |     at Function.Module._resolveFilename (node:internal/modules/cjs/loader:933:15)
WEB-CNSS     |     at Function.resolve (node:internal/modules/cjs/helpers:108:19)
WEB-CNSS     |     at Object.<anonymous> (/usr/local/lib/node_modules/react-scripts/scripts/start.js:43:31)
WEB-CNSS     |     at Module._compile (node:internal/modules/cjs/loader:1101:14)
WEB-CNSS     |     at Object.Module._extensions..js (node:internal/modules/cjs/loader:1153:10)
WEB-CNSS     |     at Module.load (node:internal/modules/cjs/loader:981:32)
WEB-CNSS     |     at Function.Module._load (node:internal/modules/cjs/loader:822:12)
WEB-CNSS     |     at Function.executeUserEntryPoint [as runMain] (node:internal/modules/run_main:81:12)
WEB-CNSS     |     at node:internal/main/run_main_module:17:47 {
WEB-CNSS     |   code: 'MODULE_NOT_FOUND',
WEB-CNSS     |   requireStack: [ '/usr/local/lib/node_modules/react-scripts/scripts/start.js' ]
WEB-CNSS     | }

也许是我的 package.json 有一些错误,所以这里也是:

{
   "name": "editor",
   "version": "0.1.0",
   "private": true,
   "dependencies": {
      "@babel/runtime": "^7.18.3",
      "@convergence/convergence": "^1.0.0-rc.12",
      "@testing-library/jest-dom": "^5.16.4",
      "@testing-library/react": "^12.1.4",
      "@testing-library/user-event": "^13.5.0",
      "ace-builds": "^1.4.14",
      "bootstrap": "^5.1.3",
      "dropzone": "^6.0.0-beta.2",
      "easymde": "^2.16.0",
      "node-sass": "^7.0.1",
      "react": "^18.0.0",
      "react-ace": "^9.5.0",
      "react-bootstrap": "^2.2.3",
      "react-dom": "^18.0.0",
      "react-drag-drop-files": "^2.3.7",
      "react-dropzone": "^14.2.2",
      "react-pro-sidebar": "^0.7.1",
      "react-scripts": "5.0.0",
      "react-simplemde-editor": "^5.0.2",
      "react-sticky-box": "^1.0.2",
      "simplemde": "^1.11.2",
      "web-vitals": "^2.1.4"
   },
   "scripts": {
      "predeploy": "npm run build",
      "deploy": "gh-pages -d build",
      "start": "react-scripts start",
      "build": "react-scripts build",
      "test": "react-scripts test",
      "eject": "react-scripts eject"
   },
   "eslintConfig": {
      "extends": [
         "react-app",
         "react-app/jest"
      ]
   },
   "browserslist": {
      "production": [
         ">0.2%",
         "not dead",
         "not op_mini all"
      ],
      "development": [
         "last 1 chrome version",
         "last 1 firefox version",
         "last 1 safari version"
      ]
   },
   "devDependencies": {
      "@convergencelabs/ace-collab-ext": "^0.6.0",
      "gh-pages": "^4.0.0"
   }
}

我还测试了 StackOverflow 上发布的其他类似问题的答案,但它们没有用。

【问题讨论】:

  • 我认为问题出在安装的节点版本上。你检查过了吗?
  • 您确定将 package-lock 复制到 dockerfile 中是正确的吗?我认为你应该复制 package.json 然后 npm install 来构建那个文件。
  • @Alen.Toma 我在 dockerfile 中使用的版本与我在本地计算机上安装的版本相同。我的同事甚至没有安装节点。但是,由于这是一个 docker 容器,FROM node:16.13.1 应该在容器上安装节点,不是吗?
  • 我也试过没有包锁,但错误仍然存​​在。 @aliFalahati

标签: reactjs docker docker-compose


【解决方案1】:

你能用这个模式来检查你是否再次收到这个错误吗

FROM node:alpine
WORKDIR /app
ENV PATH /app/node_modules/.bin:$PATH
COPY package.json ./
COPY package-lock.json ./
RUN npm install --silent
RUN npm install react-scripts@5.0.0 -g --silent
RUN npm rebuild node-sass

COPY . ./

Expose 3000
CMD ["npm", "start"]

【讨论】:

  • 如果我不指定版本 9.1.2,它会出错。这就是为什么我在我的 dockerfile 中指定它:`#0 3.280 npm notice 新的主要版本的 npm 可用! 8.19.3 -> 9.1.2 #0 3.280 npm notice 更新日志:github.com/npm/cli/releases/tag/v9.1.2 #0 3.281 npm notice 运行 npm install -g npm@9.1.2 进行更新! `
  • npm install -g npm 用于更新 npm。你根本不需要它。当您使用图像及其版本(此处为节点:16.13.1)时,您将在其中拥有最新版本的组件。这里没有必要。我认为你应该删除这个命令。
  • 我同意,但为什么会报错呢?它迫使我运行 npm install -g npm@9.1.2 ...
【解决方案2】:

它在我的电脑上也能正常工作。

尝试

$ docker-compose down
$ docker-compose up --build

再次。

【讨论】:

    【解决方案3】:

    请删除 dockerfile 中的命令行,如下所示:

    ...
    
    # RUN npm install react-scripts@5.0.0  -g --silent
    ...
    

    如果不起作用,请尝试以下操作:

    ...
    
    RUN npm install react-scripts@5.0.0
    ...
    

    希望这对你有帮助。

    【讨论】:

    • 我已经在我的 dockerfile 上这样做了。
    猜你喜欢
    • 1970-01-01
    • 2016-10-27
    • 2016-03-31
    • 2021-09-13
    • 2020-07-09
    • 2022-11-28
    • 2020-08-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多