Kļūdas “Trūkst sākuma skripta” atrisināšana programmā Node.js programmā Docker

Node.js

Node.js aizmugursistēmas palaišana programmā Docker: traucējummeklēšanas rokasgrāmata

Mēģinot palaist savu iekšā a var būt nomākta, it īpaši, ja tas ir saistīts ar vienkāršu ziņojumu “Trūkst sākuma skripta”. Šī kļūda bieži rodas, kad nevar atrast pareizo starta komandu jūsu iestatījumos. Ja jūs tas ir skārusi, jūs neesat viens!

Daudzos gadījumos problēma ir saistīta ar nepareiziem ceļiem vai nepareizi saskaņotām konfigurācijām starp jūsu package.json un Docker iestatījumiem. Saskaroties ar sīkumiem, ir viegli aizmirst , konteinerizācijas un konfigurācijas faili. Tā kā pats saskāros ar šo problēmu, varu teikt, ka tās labošana bieži ietver katra faila izvietojuma un skriptu pārbaudi.

Piemēram, es reiz izvietoju aizmugursistēmu un vēlāk sapratu, ka mana dist mape nav pareizi kartēta, kā rezultātā starta komanda neizdevās. Vienkārši pielāgojumi var atrisināt šīs problēmas, taču, lai atrastu pareizo, ir nepieciešama pacietība 🔍. Pārbaudot, vai visas atkarības un skripti ir pareizi kartēti, var ietaupīt vairākas stundas atkļūdošanas.

Šajā rokasgrāmatā mēs apskatīsim dažas praktiskas darbības šīs kļūdas labošanai, it īpaši, ja izmantojat aizmugursistēmu kopā ar datubāzi, piemēram, programmā Docker. Kopā novērsīsim “trūkstošā sākuma skripta” kļūdu, lai jūsu aizmugursistēma darbotos nevainojami!

Komanda Apraksts
CMD ["node", "dist/server.js"] Definē primāro komandu, kas startēšanas laikā darbojas Docker konteinerā. Šeit tas liek Docker startēt lietojumprogrammu, izpildot server.js mapē dist, adresējot problēmu, nodrošinot, ka Docker zina, kuru skriptu palaist.
WORKDIR /app Iestata darba direktoriju konteinerā uz /app. Tas ir ļoti svarīgi, lai nodrošinātu, ka turpmākajās komandās visi failu ceļi attiecas uz šo direktoriju, racionalizējot Docker veidošanas un izpildlaika procesus.
COPY --from=builder /app/dist ./dist Kopē izveidotos failus no dist mapes veidotāja stadijā uz izpildlaika vides dist direktoriju. Šī komanda ir būtiska, lai pārliecinātos, ka kompilētie TypeScript faili ir pieejami konteinerā.
RUN npm install --omit=dev Instalē tikai ražošanas atkarības, izlaižot izstrādātāju atkarības. Šī komanda ir optimizēta ražošanas versijām, samazinot konteinera galīgo izmēru un uzlabojot drošību, izslēdzot izstrādes rīkus.
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000"] Definē stāvokļa pārbaudi, lai pārbaudītu, vai DynamoDB pakalpojums Docker darbojas. Tas izmanto curl, lai mēģinātu izveidot savienojumu ar norādīto vietējo galapunktu, nodrošinot, ka pakalpojums ir pieejams pirms aizmugursistēmas palaišanas.
depends_on: Norāda atkarības failā docker-compose.yml. Šeit tas nodrošina, ka aizmugursistēmas pakalpojums gaida, līdz DynamoDB tiek inicializēts, novēršot kļūdu mēģinājumu izveidot savienojumu ar negatavu pakalpojumu.
EXPOSE 3001 Docker konteinerā atver portu 3001, padarot aizmugursistēmas pakalpojumu pieejamu šajā portā. Šī komanda ir nepieciešama, lai iestatītu tīklu un ļautu ārējiem pakalpojumiem vai citiem konteineriem piekļūt aizmugursistēmai.
test('dist folder exists', ...) Jest vienības tests, kas pārbauda, ​​vai dist mape ir pareizi ģenerēta. Šis tests palīdz pārbaudīt, vai izveides darbība ir bijusi veiksmīga, atklājot iespējamās problēmas ar trūkstošajiem failiem dist direktorijā.
expect(packageJson.scripts.start) Jest testa rindiņa, kas apstiprina, ka failā package.json pastāv sākuma skripts. Tas palīdz novērst izpildlaika kļūdas no startēšanas komandu iztrūkšanas, nodrošinot konfigurācijas precizitāti pirms izvietošanas.

Docker konfigurācija Node.js un datu bāzes savienojumam

Iepriekš minētajā piemērā Docker iestatīšana izmanto daudzpakāpju būvniecību, kas ir noderīga, lai izveidotu efektīvus ražošanai gatavus konteinerus. Pirmajā posmā, kas definēts kā “veidotājs”, instalē atkarības un kompilē failus uz JavaScript mapi. Šī darbība nodrošina, ka apkopotais kods ir gatavs ražošanai, neiekļaujot nevajadzīgas izstrādātāja atkarības. Pēc izveides otrais posms (izpildlaiks) kopē tikai apkopotos failus un ražošanas atkarības, samazinot konteinera izmēru. Šī iestatīšana ir īpaši noderīga, ja bieži izmantojat mākoņa vidi, kur ir svarīga katra optimizācija! 🚀

The komanda abos posmos iestata konteinera darba direktoriju uz /app. Tas vienkāršo failu ceļus un organizē visas darbības ap šo direktoriju. Pēc tam instrukcijas pārvietot konkrētus failus no saimniekdatora uz konteineru. Pirmajā posmā pakotnes*.json faili un tsconfig.json tiek kopēti, lai nodrošinātu atkarības instalēšanu un TypeScript kompilāciju, un un RUN npm palaist build komandas nodrošina, ka viss ir iestatīts pareizi. Šī iestatīšana palīdz izvairīties no tādām problēmām kā starta skriptu trūkums, pārliecinoties, ka visi faili ir pareizi kopēti un konfigurēti.

The fails savieno aizmugursistēmu ar , kas ir būtiska vietējai testēšanai un izstrādei. The opcija liek Docker palaist DynamoDB pirms aizmugursistēmas pakalpojuma, nodrošinot, ka datu bāze ir gatava visiem savienojuma mēģinājumiem no aizmugursistēmas. Reālos scenārijos šādas atkarības iestatīšanas neesamība var izraisīt savienojamības problēmas, kad aizmugurprogramma tiek startēta pirms datu bāzes, kā rezultātā rodas kaitinošas kļūdas. The veselības pārbaude komanda pārbauda, ​​vai DynamoDB ir sasniedzams, pingot galapunktam, mēģina vēlreiz, līdz tiek izveidots savienojums. Šāds kļūdu apstrādes līmenis ietaupa laiku, nodrošinot pakalpojumu sākšanu pareizajā secībā 🕒.

Visbeidzot, failā package.json esam definējuši skripts kā . Šī komanda nodrošina, ka NPM precīzi zina, kuru failu palaist konteinerā, tādējādi palīdzot izvairīties no kļūdas “trūkstoša sākuma skripta”. Ir arī izveidošanas komanda TypeScript koda kompilēšanai un tīra komanda dist mapes noņemšanai, nodrošinot, ka katra izvietošana tiek sākta no jauna. Izmantojot šādus npm skriptus, iestatīšana kļūst uzticamāka, it īpaši, ja ir iesaistīts Docker, jo tas piedāvā paredzamus ceļus un darbības. Šī visaptverošā Docker, Docker Compose un NPM skriptu konfigurācija darbojas kopā, lai izveidotu racionalizētu darbplūsmu no izstrādes līdz ražošanai.

1. risinājums. Dockerfile un Package.json pielāgošana pareizai failu kopēšanai

Šis risinājums izmanto Docker un Node.js, lai nodrošinātu, ka faili tiek pareizi kopēti dist mapi un ka NPM var atrast sākums skripts.

# Dockerfile
FROM node:18 AS builder
WORKDIR /app
# Copy necessary config files and install dependencies
COPY package*.json tsconfig.json ./
RUN npm install
# Copy all source files and build the project
COPY . .
RUN npm run build
# Production stage
FROM node:18-alpine
WORKDIR /app
COPY --from=builder /app/package*.json ./
RUN npm install --omit=dev
COPY --from=builder /app/dist ./dist
EXPOSE 3001
# Adjust command to start the server
CMD ["node", "dist/server.js"]

2. risinājums. Docker-compose.yml pārveidošana vides kontrolei

Šis risinājums maina docker-compose.yml konfigurāciju, lai norādītu pareizās komandas un nodrošinātu pareizu skriptu palaišanu programmā Docker.

# docker-compose.yml
version: "3.9"
services:
  backend:
    build:
      context: .
      dockerfile: Dockerfile
    ports:
      - "3001:3001"
    environment:
      PORT: 3001
    depends_on:
      - dynamodb
    command: ["npm", "run", "start"]
  dynamodb:
    image: amazon/dynamodb-local
    ports:
      - "8001:8000"
    healthcheck:
      test: ["CMD", "curl", "-f", "http://localhost:8000"]
      interval: 10s
      timeout: 5s
      retries: 5

3. risinājums. Package.json skriptu pārbaude un atjaunināšana

Šis risinājums paredz nodrošināt, ka sākums skripts ir pareizi definēts pack.json failu, lai novērstu trūkstošās skripta kļūdas.

{
  "name": "backend",
  "version": "1.0.0",
  "main": "dist/server.js",
  "scripts": {
    "build": "tsc",
    "start": "node dist/server.js",
    "dev": "nodemon --exec ts-node src/server.ts",
    "clean": "rimraf dist"
  }
}

Vienības testi: Skripta un Docker konfigurācijas integritātes nodrošināšana

Šie Jest testi apstiprina, ka būtiskie faili ir pareizi kopēti un NPM skripti darbojas konteinera vidē.

// test/deployment.test.js
const fs = require('fs');
describe('Deployment Tests', () => {
  test('dist folder exists', () => {
    expect(fs.existsSync('./dist')).toBe(true);
  });
  test('start script exists in package.json', () => {
    const packageJson = require('../package.json');
    expect(packageJson.scripts.start).toBe("node dist/server.js");
  });
  test('Dockerfile has correct CMD', () => {
    const dockerfile = fs.readFileSync('./Dockerfile', 'utf8');
    expect(dockerfile).toMatch(/CMD \["node", "dist\/server.js"\]/);
  });
});

Pareizas failu kopēšanas un struktūras nodrošināšana programmā Docker Node.js projektiem

Strādājot ar Node.js lietojumprogrammām programmā Docker, viens no galvenajiem apsvērumiem ir nodrošināt, lai visi nepieciešamie faili tiktu pareizi kopēti un strukturēti konteinerā. Vairāku posmu būvniecībā, tāpat kā iepriekš minētajā piemērā, katram posmam ir noteikts mērķis. Sākotnējais posms “veidotājs” apstrādā TypeScript kompilēšanu uz JavaScript un sagatavo mapi. Otrajā posmā tiek iekļauti tikai ražošanas faili, samazinot konteinera izmēru un optimizējot izvietošanu. Šī pieeja ne tikai samazina nevajadzīgu uzpūšanos, bet arī uzlabo drošību, neizmantojot izstrādes rīkus.

Būtisks Docker for Node.js aspekts ir organizēšana un precīzi. Skaidri norādot ceļus Dockerfile un nodrošinot, ka starta komanda ir pareizi iestatīta pack.json, jūs samazinat kļūdas, piemēram, "Trūkst sākuma skripta". Ir arī svarīgi apstiprināt, ka Docker zina, kur katram failam jāatrodas, jo īpaši sarežģītos iestatījumos, kas ietver vairākus pakalpojumus vai mapes. Piemēram, izmantojot komandu COPY, lai pievienotu tikai mape un nepieciešamās konfigurācijas gala konteineram nodrošina, ka ražošanā ir pieejami tikai būtiski faili 📂.

Lai pārbaudītu savu pakalpojumu stāvokli, fails izmanto veselības pārbaudi, lai pārbaudītu, vai datu bāze ir gatava. Definējot atkarības, mēs nodrošinām, ka aizmugursistēmas pakalpojums netiek startēts, kamēr datubāze nav reaģējusi, tādējādi novēršot ar laiku saistītas savienojuma problēmas. Šī iestatīšana ir īpaši noderīga reālās pasaules lietojumprogrammās, kur datu bāzes savienojamība ir ļoti svarīga. Bez šīs struktūras pakalpojumi var mēģināt izveidot savienojumu, pirms ir izveidoti citi pakalpojumi, izraisot izpildlaika kļūdas un iespējamu dīkstāvi lietotājiem 🔄.

  1. Kas izraisa NPM kļūdu "trūkst sākuma skripta"?
  2. Šī kļūda bieži rodas, ja failam nav a definēts skripts. NPM nevar atrast pareizo ievades punktu lietojumprogrammas palaišanai.
  3. Vai failam ir jābūt mapē mape?
  4. Nē, parasti atrodas saknes direktorijā, un tikai nepieciešamie faili tiek kopēti uz mapi.
  5. Kāpēc programmā Docker izmantojam daudzpakāpju būvējumus?
  6. Daudzpakāpju konstrukcija ļauj mums izveidot vieglus, ražošanai gatavus konteinerus. Atdalot būvēšanas un izpildlaika vidi, tiek izslēgti nevajadzīgi faili, tādējādi uzlabojot drošību un efektivitāti.
  7. Kā darbojas programmā Docker Compose?
  8. The komanda pārbauda, ​​vai pakalpojums ir izveidots un darbojas, kas ir būtiski gadījumos, kad vispirms ir jāsagatavo atkarīgie pakalpojumi, piemēram, datu bāzes.
  9. Vai šajā iestatījumā varu izmantot citas datu bāzes, nevis DynamoDB?
  10. Jā, jūs varat nomainīt ar citām datu bāzēm. Pielāgojiet Docker Compose konfigurāciju, lai tā atbilstu jūsu vēlamajam datu bāzes pakalpojumam.
  11. Kāpēc mēs izmantojam komanda?
  12. Šī komanda instalē tikai ražošanas atkarības, kas palīdz saglabāt konteinera svaru, izslēdzot izstrādes rīkus.
  13. Kā es varu apstiprināt mape ir pareizi kopēta?
  14. Kodā varat pievienot testu, lai pārbaudītu, vai pastāv, vai izmantojiet Docker CLI, lai pārbaudītu konteinera saturu pēc būvēšanas.
  15. Vai man ir jānorāda ports gan Dockerfile, gan Docker Compose?
  16. Jā, norādot portu abos, tiek nodrošināts, ka konteinera ports atbilst resursdatora portam, padarot pakalpojumu pieejamu no ārpuses Docker.
  17. Kāpēc ir iestatīšana vai Docker ir svarīgi?
  18. Iestatījums izveido noklusējuma direktorijas ceļu visām komandām, vienkāršojot failu ceļus un sistemātiski organizējot konteinera failus.
  19. Kā es varu skatīt Docker žurnālus, lai atkļūdotu šo kļūdu?
  20. Izmantot lai piekļūtu žurnāliem, kas var sniegt ieskatu startēšanas kļūdās vai trūkstošajos failos.

Lai novērstu kļūdu “trūkstošs sākuma skripts”, jāpievērš uzmanība detaļām, jo ​​īpaši Docker failu struktūras un NPM skriptu konfigurēšanai. Dockerfile pārbaude, lai pārliecinātos, ka apkopotie faili tiek kopēti uz mapi un ka starta skripts failā package.json ir pareizi definēts, var ietaupīt vairākas stundas atkļūdošanas.

Skaidras iestatīšanas un sakārtotu skriptu uzturēšana palīdzēs Docker konteineriem darboties bez problēmām, un, izmantojot Docker Compose veselības pārbaudes, pakalpojumi tiek ielādēti pareizā secībā. Izmantojot šos pielāgojumus, jūsu aizmugursistēmai ir jāsākas droši, nodrošinot vienmērīgāku izstrādes darbplūsmu. 🛠️

  1. Detalizēta informācija par Docker daudzpakāpju būvējumiem un paraugpraksi Node.js lietojumprogrammām programmā Docker: Docker dokumentācija
  2. Visaptveroša rokasgrāmata par veselības pārbaužu un atkarību iestatīšanu programmā Docker Compose, lai nodrošinātu, ka pakalpojumi sākas pareizajā secībā: Docker Compose veselības pārbaude
  3. “Trūkstoša sākuma skripta” kļūdu un citu izplatītu NPM problēmu novēršana, tostarp pareiza pakotnes.json konfigurēšana ražošanas versijām: NPM dokumentācija
  4. Ievads DynamoDB Local konfigurēšanā un testēšanā Docker vidēs, tostarp lietošanā ar Node.js aizmugursistēmām: AWS DynamoDB Local Guide