Javascript 在docker内部运行时未找到节点导入模块
我有一个带有节点js服务器的小型react应用程序,具有以下导入: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
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
。