typescript - რატომ არ ისმენს ჩემი Docker კონტეინერი ცვლილებებს ჩემს ფაილებში
მოკლედ, მე ვვითარდებ ამ ბექენდს NestJS და Docker-ის გამოყენებით docker-compose-ის საშუალებით უკვე დაახლოებით 6 თვეა, მაგრამ არასდროს მქონია პრობლემა, რომ ჩემი Docker არ მოუსმენს ფაილის ცვლილებებს. რამდენიმე დღის წინ ამის გაკეთება დაიწყო და არ ვიცი რატომ.
ეს ჩემი Docker ფაილია
FROM node:14-alpine
ENV NODE_ENV development
ENV NODE_OPTIONS=--max_old_space_size=8192
RUN mkdir -p /usr/src/app
WORKDIR /usr/src/app
COPY . .
RUN yarn install
ENTRYPOINT ["yarn", "start:dev"]
და ეს არის ჩემი docker-compose ფაილი
services:
api:
image: cacao-be
container_name: cacao-be-api
build:
context: .
dockerfile: Dockerfile
ports:
- '3000:3000'
depends_on:
- postgres
volumes:
- ./src:/usr/src/app/src
networks:
- default
links:
- redis
env_file:
- .env
volumes:
db_data:
admin_data:
redis_data:
driver: local
ეს არის ჩემი package.json რომელიც შეიცავს სკრიპტს ჩემი პროექტის გასაშვებად
"scripts": {
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch"
}
აქ არის ასევე ჩემი tsconfig ფაილი
{
"compilerOptions": {
"jsx": "react",
"module": "commonjs",
"declaration": true,
"removeComments": true,
"emitDecoratorMetadata": true,
"experimentalDecorators": true,
"allowSyntheticDefaultImports": true,
"esModuleInterop": true,
"target": "es2017",
"sourceMap": true,
"outDir": "./dist",
"baseUrl": "./",
"incremental": true,
"resolveJsonModule": true,
"skipLibCheck": true,
},
}
და tsconfig.build.json ფაილი
{
"extends": "./tsconfig.json",
"exclude": ["node_modules", "test", "dist", "**/*spec.ts"]
}
მოვუხდინე ჩემი პროექტის გაშვება Docker-ის გარეშე და ის უსმენდა ფაილის ცვლილებებს, მაგრამ როდესაც დავუშვი Docker-ში, მან შეწყვიტა მათზე სმენა. გავიარე შემოწმება და ის მუშაობს watch რეჟიმში ორივე მეთოდით. კომპილაციის დაწყება watch რეჟიმში...
ასევე, მე შევედი ჩემს კონტეინერში cmd-ის საშუალებით და შევამოწმე, შეიცვალნენ თუ არა ფაილები, როდესაც შევცვალე ისინი, და ისინი მართლაც შეიცვალნენ (მეგობრობით ვიყავი დარწმუნებული, რომ ჩემი სერვისი სწორად იყო დაინსტალირებული). ასე რომ, კონტეინერის შიგნით ფაილები იცვლება, მაგრამ განვითარების პროცესს თავიდან დაწყება არ სჭირდება.
მე შევადგინე
command: npm run start:dev
ჩემს docker-compose ფაილში, მაგრამ არ მუშაობდა. ჩემი დოკერის გაწმენდა და მისი გადატვირთვა ასევე არ მუშაობდა.
მე ველოდები, რომ როცა ფაილს შევინახავ, ჩემი Docker ლოგები გადატვირთება და ცვლილებებს გამოიყენებს.
პასუხი #1
ბოდიშს გიხდით, რომ პარტიზე დაგვიანებით მოვედი. სინამდვილეში ეს დაკავშირებულია TypeScript-ის ვერსიასთან. თუ გადმოწერთ 4.9-ში, მაშინ ის უკვე აღარ იმუშავებს. რადგან 4.9-ში შეცვალეს, როგორ უნდა დაკვირდებოდნენ ფაილები, და ახლა იყენებენ FS მოვლენებს ჩარჩოიანი გამოკითხვის ნაცვლად. ამის შესახებ უფრო ბევრს შეგიძლიათ წაიკითხოთ აქ. ასე რომ, თუ გინდათ კვლავ მუშაობდეს, ამ დროისთვის გამოიყენეთ 4.8.4. თქვენს package.json-ში შეცვალეთ typescript ვერსია შემდეგნაირად:
{
...
"devDependencies": {
...
"typescript": "~4.8.4",
...
},
...
}
პასუხი #2
აქაც იგივე პრობლემა მაქვს NestJS სერვისებთან Docker-compose-ში. გორჯინი დატვირთვა რამდენიმე დღის წინ შეწყდა მუშაობა.
დოკერფაილი :
FROM node:16-alpine
WORKDIR /usr/local/app
COPY package.json .
RUN npm install
COPY . .
CMD ["npm", "run", "start:dev"]
docker-compose.yml ფაილი
back:
build: ./back
restart: unless-stopped
hostname: back
ports: #For health check
- "3001:3001"
volumes:
- ./back:/usr/local/app
- node_modules_back:/usr/local/app/node_modules
networks:
- backend
depends_on:
db:
condition: service_healthy
links:
- db
NestJS სკრიპტები
"scripts": {
"prebuild": "rimraf dist",
"build": "nest build",
"format": "prettier --write \"src/**/*.ts\" \"test/**/*.ts\"",
"start": "nest start",
"start:dev": "nest start --watch",
"start:debug": "nest start --debug --watch",
"start:prod": "node dist/main",
"lint": "eslint \"{src,apps,libs,test}/**/*.ts\" --fix",
"test": "jest",
"test:watch": "jest --watch",
"test:cov": "jest --coverage",
"test:debug": "node --inspect-brk -r tsconfig-paths/register -r ts-node/register node_modules/.bin/jest --runInBand",
"test:e2e": "jest --config ./test/jest-e2e.json",
"ci": "npm run build && npm run format && npm run lint && npm run test && npm audit"
},
