Javascript 在docker内部运行时未找到节点导入模块

Javascript 在docker内部运行时未找到节点导入模块,javascript,node.js,reactjs,express,npm,Javascript,Node.js,Reactjs,Express,Npm,我有一个带有节点js服务器的小型react应用程序,具有以下导入: import express from 'express' import compression from 'compression' import cookieParser from 'cookie-parser' import bodyParser from 'body-parser' import * as path from 'path' import * as _ from 'lodash' import { Clou

我有一个带有节点js服务器的小型react应用程序,具有以下导入:

import express from 'express'
import compression from 'compression'
import cookieParser from 'cookie-parser'
import bodyParser from 'body-parser'
import * as path from 'path'
import * as _ from 'lodash'
import { CloudConfigOptions, Config, ConfigObject } from 'spring-cloud-config'

import { ApiService } from './src/service/ApiService'
import { BackendEnum } from './src/service/BackendEnum'
然后是几个端点,例如:

server.put('/data', keycloak.protect('user'), (req: any, res: any) => { 
    ApiService.runSomeLogic();

    return res
})
在本地计算机上运行时:
npm run dev:express
服务器启动正常

现在的问题是,当我构建docker映像并尝试运行它时,会出现以下错误:

$ docker run my-container:1.0

> my-app@0.1.0 start /app
> cross-env NODE_ENV=production node server.js

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

Error: Cannot find module './src/service/ApiService'
Require stack:
- /app/server.js
    at Function.Module._resolveFilename (internal/modules/cjs/loader.js:982:15)
    at Function.Module._load (internal/modules/cjs/loader.js:864:27)
    at Module.require (internal/modules/cjs/loader.js:1044:19)
    at require (internal/modules/cjs/helpers.js:77:18)
    at Object.<anonymous> (/app/server.js:58:20)
    at Module._compile (internal/modules/cjs/loader.js:1158:30)
    at Object.Module._extensions..js (internal/modules/cjs/loader.js:1178:10)
    at Module.load (internal/modules/cjs/loader.js:1002:32)
    at Function.Module._load (internal/modules/cjs/loader.js:901:14)
    at Function.executeUserEntryPoint [as runMain] (internal/modules/run_main.js:74:12) {
  code: 'MODULE_NOT_FOUND',
  requireStack: [ '/app/server.js' ]
}
npm ERR! code ELIFECYCLE
npm ERR! errno 1
npm ERR! my-app@0.1.0 start: `cross-env NODE_ENV=production node server.js`
npm ERR! Exit status 1
npm ERR! 
npm ERR! Failed at the my-app@0.1.0 start script.
npm ERR! This is probably not a problem with npm. There is likely additional logging output above.

npm ERR! A complete log of this run can be found in:
npm ERR!     /root/.npm/_logs/2021-03-29T15_29_46_508Z-debug.log
编辑:
Dockerfile
内容为:

FROM node:12.16.1-alpine as node

### WEB
FROM node as web-builder

WORKDIR /src
COPY ./my-app/package*.json ./
COPY ./my-app/.npmrc ./
RUN apk add --no-cache git openssh
RUN npm -q install

COPY ./my-app ./

# specify ARG as late as possible to take advantage of docker layer caching across dockerfiles
ARG BUILD_ID
RUN BUILD_ID=${BUILD_ID} npm run build


FROM node as web-release

WORKDIR /app
RUN apk add --no-cache git openssh
COPY ./my-app/package*.json ./
COPY ./my-app/.npmrc ./
RUN npm install -q --only=prod && \
    npm cache clean --force

COPY --from=web-builder /src/build ./build/
COPY --from=web-builder /src/server.js ./
COPY --from=web-builder /src/config ./config/

CMD ["npm", "start"]
{
    "name": "my-app",
    "version": "0.1.0",
    "private": true,
    "scripts": {
        "start": "cross-env NODE_ENV=production node server.js",
        "dev": "react-scripts start",
        "build": "npm run lint && npm run build:frontend && npm run build:backend",
        "build:frontend": "react-scripts build",
        "build:backend": "tsc -p tsconfig.server.json",
        "lint": "tsc --noEmit && tslint -c tslint.json -p .",
        "dev:express": "cross-env SPRING_PROFILES=local NODE_ENV=development ENVIRONMENT=local nodemon server.ts -p tsconfig.server.json"
    },
    "eslintConfig": {
        "extends": "react-app"
    },
    "husky": {
        "hooks": {
            "pre-commit": "lint-staged"
        }
    },
    "lint-staged": {
        "*.{js,md,json,css,md,html}": [
            "prettier --write",
            "git add"
        ],
        "*.{ts,tsx}": [
            "prettier --write",
            "tslint --fix",
            "git add"
        ]
    },
    "dependencies": {
        "@martin_hotell/rex-tils": "",
        "@types/express-session": "",
        "axios": "",
        "compression": "",
        "cookie-parser": "",
        "cookie-session": "",
        "cross-env": "",
        "express": "",
        "express-basic-auth": "",
        "express-session": "",
        "fork-ts-checker-webpack-plugin": "",
        "keycloak-connect": "",
        "lodash": "",
        "react": "",
        "react-dom": "",
        "react-dropzone": "",
        "react-dual-listbox": "",
        "react-popper": "",
        "react-redux": "",
        "react-scripts": "",
        "react-sortable-tree": "",
        "react-transition-group": "",
        "redux": "",
        "redux-devtools-extension": "",
        "redux-thunk": "",
        "spring-cloud-config": "",
        "styled-components": "",
        "typescript": "",
        "uuid": ""
    },
    "devDependencies": {
        "@types/compression": "",
        "@types/cookie-parser": "",
        "@types/express": "",
        "@types/lodash": "",
        "@types/node": "",
        "@types/react": "",
        "@types/react-dom": "",
        "@types/react-redux": "",
        "@types/react-sortable-tree": "",
        "@types/redux-mock-store": "",
        "@types/styled-components": "",
        "@types/uuid": "",
        "husky": "",
        "lint-staged": "",
        "nodemon": "",
        "prettier": "",
        "react-dnd": "",
        "redux-mock-store": "",
        "ts-node": "",
        "tslint": "",
        "tslint-config-prettier": "",
        "tslint-react": "",
        "typescript": ""
    },
    "browserslist": {
        "production": [
            (...)
        ],
        "development": [
            (...)
        ]
    }
}
EDIT2:
package.json
(出于隐私原因,我删除了每个库的版本)内容是:

FROM node:12.16.1-alpine as node

### WEB
FROM node as web-builder

WORKDIR /src
COPY ./my-app/package*.json ./
COPY ./my-app/.npmrc ./
RUN apk add --no-cache git openssh
RUN npm -q install

COPY ./my-app ./

# specify ARG as late as possible to take advantage of docker layer caching across dockerfiles
ARG BUILD_ID
RUN BUILD_ID=${BUILD_ID} npm run build


FROM node as web-release

WORKDIR /app
RUN apk add --no-cache git openssh
COPY ./my-app/package*.json ./
COPY ./my-app/.npmrc ./
RUN npm install -q --only=prod && \
    npm cache clean --force

COPY --from=web-builder /src/build ./build/
COPY --from=web-builder /src/server.js ./
COPY --from=web-builder /src/config ./config/

CMD ["npm", "start"]
{
    "name": "my-app",
    "version": "0.1.0",
    "private": true,
    "scripts": {
        "start": "cross-env NODE_ENV=production node server.js",
        "dev": "react-scripts start",
        "build": "npm run lint && npm run build:frontend && npm run build:backend",
        "build:frontend": "react-scripts build",
        "build:backend": "tsc -p tsconfig.server.json",
        "lint": "tsc --noEmit && tslint -c tslint.json -p .",
        "dev:express": "cross-env SPRING_PROFILES=local NODE_ENV=development ENVIRONMENT=local nodemon server.ts -p tsconfig.server.json"
    },
    "eslintConfig": {
        "extends": "react-app"
    },
    "husky": {
        "hooks": {
            "pre-commit": "lint-staged"
        }
    },
    "lint-staged": {
        "*.{js,md,json,css,md,html}": [
            "prettier --write",
            "git add"
        ],
        "*.{ts,tsx}": [
            "prettier --write",
            "tslint --fix",
            "git add"
        ]
    },
    "dependencies": {
        "@martin_hotell/rex-tils": "",
        "@types/express-session": "",
        "axios": "",
        "compression": "",
        "cookie-parser": "",
        "cookie-session": "",
        "cross-env": "",
        "express": "",
        "express-basic-auth": "",
        "express-session": "",
        "fork-ts-checker-webpack-plugin": "",
        "keycloak-connect": "",
        "lodash": "",
        "react": "",
        "react-dom": "",
        "react-dropzone": "",
        "react-dual-listbox": "",
        "react-popper": "",
        "react-redux": "",
        "react-scripts": "",
        "react-sortable-tree": "",
        "react-transition-group": "",
        "redux": "",
        "redux-devtools-extension": "",
        "redux-thunk": "",
        "spring-cloud-config": "",
        "styled-components": "",
        "typescript": "",
        "uuid": ""
    },
    "devDependencies": {
        "@types/compression": "",
        "@types/cookie-parser": "",
        "@types/express": "",
        "@types/lodash": "",
        "@types/node": "",
        "@types/react": "",
        "@types/react-dom": "",
        "@types/react-redux": "",
        "@types/react-sortable-tree": "",
        "@types/redux-mock-store": "",
        "@types/styled-components": "",
        "@types/uuid": "",
        "husky": "",
        "lint-staged": "",
        "nodemon": "",
        "prettier": "",
        "react-dnd": "",
        "redux-mock-store": "",
        "ts-node": "",
        "tslint": "",
        "tslint-config-prettier": "",
        "tslint-react": "",
        "typescript": ""
    },
    "browserslist": {
        "production": [
            (...)
        ],
        "development": [
            (...)
        ]
    }
}
我很确定问题在于
ApiService
BackendEnum
的导入是如何定义的,但我缺乏节点/javascript知识,因此无法确定如何修复此导入


有人能发现我的导入有什么问题吗?为什么应用程序在docker容器中运行时会崩溃?

您不是在第二个容器中复制所有源代码,而是只复制一个文件,即server.js。冒犯的路线是

COPY --from=web-builder /src/server.js ./
把这行改成

COPY --from=web-builder /src ./

如果仍然报告错误,请提供错误日志。如果它有效,您就不需要另外两个复制语句。

我没有使用巴贝尔。我正在使用一个带有小型nodejs服务器的react应用程序。我编辑了这个问题以反映这个细节。很抱歉给你带来了困惑。我编辑了这个问题,将刚刚添加到
EDIT2
占位符中的
package.json
内容添加到初始问题中的
Dockerfile