#javascript #node.js #reactjs #express #npm
#javascript #node.js #reactjs #экспресс #npm
Вопрос:
У меня есть небольшое приложение react с узловым js-сервером со следующим импортом:
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
Образ docker создается с использованием npm -q install
, npm -q install
а затем npm run build
И это выходные -debug.log
данные файла npm:
0 info it worked if it ends with ok
1 verbose cli [ '/usr/local/bin/node', '/usr/local/bin/npm', 'start' ]
2 info using npm@6.13.4
3 info using node@v12.16.1
4 verbose run-script [ 'prestart', 'start', 'poststart' ]
5 info lifecycle my-app@0.1.0~prestart: my-app@0.1.0
6 info lifecycle my-app@0.1.0~start: my-app@0.1.0
7 verbose lifecycle my-app@0.1.0~start: unsafe-perm in lifecycle true
8 verbose lifecycle my-app@0.1.0~start: PATH: /usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/node-gyp-bin:/app/node_modules/.bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
9 verbose lifecycle my-app@0.1.0~start: CWD: /app
10 silly lifecycle my-app@0.1.0~start: Args: [ '-c', 'cross-env NODE_ENV=production node server.js' ]
11 silly lifecycle my-app@0.1.0~start: Returned: code: 1 signal: null
12 info lifecycle my-app@0.1.0~start: Failed to exec start script
13 verbose stack Error: my-app@0.1.0 start: `cross-env NODE_ENV=production node server.js`
13 verbose stack Exit status 1
13 verbose stack at EventEmitter.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/index.js:332:16)
13 verbose stack at EventEmitter.emit (events.js:311:20)
13 verbose stack at ChildProcess.<anonymous> (/usr/local/lib/node_modules/npm/node_modules/npm-lifecycle/lib/spawn.js:55:14)
13 verbose stack at ChildProcess.emit (events.js:311:20)
13 verbose stack at maybeClose (internal/child_process.js:1021:16)
13 verbose stack at Process.ChildProcess._handle.onexit (internal/child_process.js:286:5)
14 verbose pkgid my-app@0.1.0
15 verbose cwd /app
16 verbose Linux 5.8.0-48-generic
17 verbose argv "/usr/local/bin/node" "/usr/local/bin/npm" "start"
18 verbose node v12.16.1
19 verbose npm v6.13.4
20 error code ELIFECYCLE
21 error errno 1
22 error my-app@0.1.0 start: `cross-env NODE_ENV=production node server.js`
22 error Exit status 1
23 error Failed at the my-app@0.1.0 start script.
23 error This is probably not a problem with npm. There is likely additional logging output above.
24 verbose exit [ 1, true ]
EDIT: The Dockerfile
content is:
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 amp;amp;
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"]
EDIT2: package.json
(по соображениям конфиденциальности я удалил версию каждой библиотеки) содержимое:
{
"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 amp;amp; npm run build:frontend amp;amp; npm run build:backend",
"build:frontend": "react-scripts build",
"build:backend": "tsc -p tsconfig.server.json",
"lint": "tsc --noEmit amp;amp; 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
, но мое отсутствие знаний node / javascript мешает мне понять, как исправить этот импорт.
Может ли кто-нибудь определить, что не так с моим импортом и почему приложение выходит из строя при запуске внутри контейнера docker?
Комментарии:
1. Вы уже решили эту проблему? Если это так, было бы здорово получить обновление, я столкнулся с той же проблемой.
2. @RobertHarbison да, проверьте принятый ответ ниже
Ответ №1:
Вы не копируете весь исходный код во второй контейнер, вместо этого копируете только один файл, т.е.) server.js . Оскорбительная строка — это,
COPY --from=web-builder /src/server.js ./
Измените эту строку на
COPY --from=web-builder /src ./
Если он по-прежнему сообщает об ошибке, пожалуйста, предоставьте журнал ошибок. Если это сработает, вам не понадобятся два других оператора копирования.
Комментарии:
1. Я не использую babel. Я использую приложение react с небольшим сервером nodejs внутри. Я отредактировал вопрос, чтобы отразить эту деталь. Извините за путаницу. Я отредактировал вопрос, чтобы включить
Dockerfile
2. Просто добавил в
EDIT2
заполнитель содержимоеpackage.json
к первоначальному вопросу.