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"
  },