node.js - Kan inte få nodemon/ts-node-dev att fungera på dockeriserad MEAN-stack
Helt ny på Mean Stack men har lyckats sätta upp en i en dockeriserad miljö genom att följa olika handledningar. Jag använde främst den som förklaras på https://itnext.io/building-restful-web-apis-with-node-js-express-mongodb-and-typescript-part-1-2-195bdaf129cf
Problemet jag har är att få ändringar i TypeScript-filer automatiskt kompilerade och tjänsten omstartad misslyckas, och jag är osäker på vad jag saknar i konfigurationen. Jag har försökt med olika iterationer med nodemon och ts-node-dev utan framgång.
Servern startar och serverar sidor 100%, men en kodändring triggar ingenting.
Nedan finns Dockerfile (för Node Express-servern), package.json och min tsconfig.json. Om någon möjligtvis kan indikera var jag gör fel skulle det vara en stor hjälp. Jag har också visat min docker-compose.yml-fil för hela stacken.
Dockerfile
FROM node:latest
Create app directory
WORKDIR /usr/src/app
Install app dependencies
A wildcard is used to ensure both package.json AND package-lock.json are copied
where available (npm@5+)
COPY package*.json ./
RUN npm install
RUN npm install --save body-parser express mongoose
RUN npm install --save nocache
RUN npm install --save nodemon typescript ts-node ts-node-dev
RUN npm install --save-dev tsc-watch
If you are building your code for production
RUN npm ci --only=production
Bundle app source
COPY . .
EXPOSE 3000 27017
Also tried starting with 'dev'
CMD [ "npm", "run", "prod" ]
package.json
{
"name": "apis-project",
"version": "1.0.0",
"description": "https://itnext.io/building-restful-web-apis-with-node-js-express-mongodb-and-typescript-part-1-2-195bdaf129cf",
"main": "index.js",
"scripts": {
"build": "tsc",
"dev": "ts-node ./lib/server.ts",
"start": "nodemon ./dist/server.js",
"prod": "npm run build && npm run start"
},
"keywords": [
"nodejs",
"typescript"
],
"author": "",
"license": "ISC",
"dependencies": {
"@types/express": "^4.17.1",
"body-parser": "^1.19.0",
"express": "^4.17.1",
"mongoose": "^5.7.7",
"nodemon": "^1.19.4"
},
"devDependencies": {
"ts-node-dev": "^1.0.0-pre.43"
}
}
Andra varianter jag har provat inom skriptavsnittet är:
"dev2": "ts-node-dev --respawn --transpileOnly ./lib/server.ts",
"dev3": "nodemon --watch 'lib/*.ts' --exec 'ts-node' lib/server.ts",
"dev5": "tsc-watch ./lib/server.ts --outDir ./dist --onSuccess \"node ./dist/server.js\" --onFailure \"echo Beep! Compilation Failed\" --compiler typescript/bin/tsc",
"dev6": "tsc-watch ./lib/*.ts --outDir ./dist --onSuccess \"node ./dist/server.js\" --onFailure \"echo Beep! Compilation Failed\" --compiler typescript/bin/tsc",
"dev7": "tsc-watch ./lib/server.ts --outDir ./dist --onSuccess \"node ./dist/server.js\" --onFailure \"echo Beep! Compilation Failed\" --compiler typescript/bin/tsc",
"x-compile": "tsc && node ./dist/server.js",
"x-dev": "./node_modules/nodemon/bin/nodemon.js -e ts --exec \"npm run x-compile\"",
tsconfig.json
// tsconfig.json
{
"compilerOptions": {
"module": "commonjs",
"moduleResolution": "node",
"pretty": true,
"sourceMap": true,
"target": "es6",
"outDir": "./dist",
"baseUrl": "./lib"
},
"include": [
"lib/**/*.ts"
],
"exclude": [
"node_modules"
]
}
docker-compose.yml
version: '3' # specify docker-compose version
Define the services/containers to be run
services:
angular: # name of the first service
hostname: localhost
build: serviceangular # specify the directory of the Dockerfile
ports:
- 4200:4200 # specify port forewarding
#
express: #name of the second service
build: ./node-apis-project # specify the directory of the Dockerfile
ports:
- 3000:3000 #specify ports forwarding
links:
- database
database: # name of the third service
image: mongo # specify image to build container from
ports:
- 27017:27017 # specify port forewarding
volumes:
- ./data/mongo:/data/db
volumes:
data:
external: true
Docker-loggar utskrift när man tittar på express-behållaren
> [email prod /usr/src/app
> npm run build && npm run start
> [email build /usr/src/app
> tsc
> [email start /usr/src/app
> nodemon ./dist/server.js
[nodemon] 1.19.4
[nodemon] to restart at any time, enter `rs`
[nodemon] watching dir(s): lib/**/*
[nodemon] watching extensions: js
[nodemon] starting `node ./dist/server.js`
(node:62) DeprecationWarning: current URL string parser is deprecated, and will be removed in a future version. To use the new parser, pass option { useNewUrlParser: true } to MongoClient.connect.
(node:62) DeprecationWarning: current Server Discovery and Monitoring engine is deprecated, and will be removed in a future version. To use the new Server Discover and Monitoring engine, pass option { useUnifiedTopology: true } to the MongoClient constructor.
Express server listening on port 3000
Svar #1
Du kanske har hittat en lösning vid det här laget. Jag lämnar detta svar som en referens.
I
docker-compose.yml, se till att du redan har mappat källkoden till app-tjänsten. I ditt fall:version: '3' services: ... express: build: ./node-apis-project ports: - 3000:3000 links: - database volumes: - .:/usr/src/app # same as WORKDIR in your Dockerfile ...Enligt nodemons manual kan den normala övervakningsmekanismen misslyckas i vissa nätverksmiljöer (till exempel en container som kör nodemon och läser från en monterad enhet), så du kan behöva använda polling, vilket är lite CPU-krävande (6-10% CPU-användning i mitt fall)
För nodemon, använd
--legacy-watch:"dev3": "nodemon --legacy-watch --watch 'lib/*.ts' --exec 'ts-node' lib/server.ts",För ts-node-dev, använd
--poll:"dev2": "ts-node-dev --poll --respawn --transpile-only ./lib/server.ts",
Svar #2
För alla andra som hamnade på detta problem på grund av problem med Kubernetes + ts-node-dev som misslyckas och skickar fel som liknar:
[INFO] 09:29:47 ts-node-dev ver. 1.1.1 (using ts-node ver. 9.1.1, typescript ver. 4.1.3)
npm ERR! path /app
npm ERR! command failed
npm ERR! signal SIGKILL
npm ERR! command sh -c ts-node-dev src/index.ts
kontrollera de resurser du har tilldelat containern i din deployments yaml och försök att avgränsa dem mindre.
det löste problemet för mig och jag kunde ta del av resurserna efter detta.
