„Node.js Backend“ paleidimas programoje „Docker“: trikčių šalinimo vadovas
Bandant paleisti savo Node.js backend viduje a Docker konteineris gali būti varginantis, ypač kai taip yra dėl paprasto pranešimo „Trūksta pradžios scenarijaus“. Ši klaida dažnai įvyksta, kai NPM negalite rasti tinkamos pradžios komandos jūsų sąrankoje. Jei jus tai ištiko, jūs ne vieni!
Daugeliu atvejų problema kyla dėl neteisingų kelių arba netinkamai suderintų paketo.json ir Docker nustatymų konfigūracijų. Nagrinėjant mažą smulkmeną lengva nepastebėti kelių etapų statyba, konteinerių ir konfigūracijos failus. Pats susidūręs su šia problema galiu pasakyti, kad ją taisant dažnai reikia patikrinti kiekvieno failo vietą ir scenarijus.
Pavyzdžiui, kartą įdiegiau užpakalinę programą ir vėliau supratau, kad mano dist aplankas nebuvo tinkamai susietas, todėl paleisties komanda nepavyko. Paprasti pakeitimai gali išspręsti šias problemas, tačiau norint rasti tinkamą, reikia kantrybės 🔍. Patikrinus, ar visos priklausomybės ir scenarijai tinkamai susieti, gali sutaupyti valandų derinimo.
Šiame vadove apžvelgsime keletą praktinių šios klaidos ištaisymo veiksmų, ypač jei naudojate pagrindinę programą kartu su tokia duomenų baze kaip DynamoDB programoje Docker. Kartu pašalinkime „trūkusio pradžios scenarijaus“ klaidą, kad jūsų užpakalinė programa veiktų sklandžiai!
komandą | Aprašymas |
---|---|
CMD ["node", "dist/server.js"] | Apibrėžia pagrindinę komandą, kuri vykdoma Docker konteineryje paleidžiant. Čia jis nurodo „Docker“ paleisti programą, vykdant server.js aplanke dist, adresu trūksta pradžios scenarijaus problemą, užtikrinant, kad „Docker“ žinotų, kurį scenarijų paleisti. |
WORKDIR /app | Darbinį katalogą konteinerio viduje nustato į /app. Tai labai svarbu norint užtikrinti, kad visi failų keliai vėlesnėse komandose būtų nukreipti į šį katalogą, supaprastinant „Docker“ kūrimo ir vykdymo procesus. |
COPY --from=builder /app/dist ./dist | Nukopijuojami sukurti failai iš dist aplanko kūrimo etape į vykdymo aplinkos dist katalogą. Ši komanda yra būtina norint užtikrinti, kad sudėtiniai „TypeScript“ failai būtų prieinami konteineryje. |
RUN npm install --omit=dev | Diegiamos tik gamybos priklausomybės, praleisdamos kūrėjo priklausomybes. Ši komanda optimizuota gamybos versijoms, sumažinant galutinį konteinerio dydį ir pagerinant saugumą, neįtraukiant kūrimo įrankių. |
healthcheck: test: ["CMD", "curl", "-f", "http://localhost:8000"] | Apibrėžiamas būklės patikrinimas, siekiant patikrinti, ar „Docker“ veikia „DynamoDB“ paslauga. Ji naudoja curl bandydama prisijungti prie nurodyto vietinio galinio taško, užtikrindama, kad paslauga būtų prieinama prieš paleidžiant užpakalinę programą. |
depends_on: | Nurodo priklausomybes docker-compose.yml. Čia užtikrinama, kad užpakalinė paslauga lauktų, kol „DynamoDB“ bus inicijuota, taip išvengiant klaidų bandant prisijungti prie neparuoštos paslaugos. |
EXPOSE 3001 | Atidaro 3001 prievadą „Docker“ konteineryje, todėl šiame prievade pasiekiama užpakalinės sistemos paslauga. Ši komanda reikalinga norint nustatyti tinklą ir leisti išorinėms paslaugoms ar kitiems konteineriams pasiekti užpakalinę programą. |
test('dist folder exists', ...) | Jest vieneto testas, kuris patikrina, ar dist aplankas buvo tinkamai sugeneruotas. Šis testas padeda patikrinti, ar kūrimo veiksmas pavyko, ir nustatomos galimos problemos dėl trūkstamų failų dist kataloge. |
expect(packageJson.scripts.start) | „Jest“ bandymo eilutė, patvirtinanti, kad pakete package.json yra pradžios scenarijus. Tai padeda išvengti vykdymo klaidų, kai trūksta paleidimo komandų, nes prieš diegiant konfigūracijos tikslumą užtikrinama. |
„Docker“ konfigūracija, skirta Node.js ir duomenų bazės ryšiui
Aukščiau pateiktame pavyzdyje „Docker“ sąranka naudoja kelių etapų kūrimą, kuris yra naudingas kuriant efektyvius gamybai paruoštus konteinerius. Pirmasis etapas, apibrėžiamas kaip „kūrėjas“, įdiegia priklausomybes ir sukompiliuoja TypeScript failus į „JavaScript“, esantį raj aplanką. Šis veiksmas užtikrina, kad sudarytas kodas būtų paruoštas gamybai, neįtraukiant nereikalingų kūrėjo priklausomybių. Sukūrus, antrasis etapas (vykdymo laikas) kopijuoja tik sukompiliuotus failus ir gamybos priklausomybes, sumažindamas konteinerio dydį. Ši sąranka ypač naudinga, jei dažnai diegiate debesų aplinkoje, kur svarbi kiekviena optimizavimo dalis! 🚀
The DARBO VADOVAS komanda abiejuose etapuose nustato konteinerio darbo katalogą į /app. Tai supaprastina failų kelius ir organizuoja visas operacijas šiame kataloge. Po to, KOPIJUOT instrukcijos perkelia konkrečius failus iš pagrindinio kompiuterio į konteinerį. Pirmajame etape paketai*.json failai ir tsconfig.json nukopijuojami, kad būtų galima įdiegti priklausomybę ir kompiliuoti TypeScript, ir RUN npm įdiegti ir RUN npm run build komandos užtikrina, kad viskas nustatyta teisingai. Ši sąranka padeda išvengti problemų, pvz., trūkstamų paleidimo scenarijų, nes visi failai yra tinkamai nukopijuoti ir sukonfigūruoti.
The docker-compose.yml failas sujungia užpakalinę programą su DynamoDB, kuri yra būtina vietiniams bandymams ir plėtrai. The priklauso nuo parinktis nurodo „Docker“ paleisti „DynamoDB“ prieš užpakalinės sistemos paslaugą, užtikrinant, kad duomenų bazė būtų paruošta bet kokiems prisijungimo bandymams iš užpakalinės programos. Realiuose scenarijuose, jei tokios priklausomybės sąrankos nėra, gali kilti ryšio problemų, kai užpakalinė programa paleidžiama anksčiau nei duomenų bazė, todėl gali atsirasti varginančių klaidų. The sveikatos patikrinimas komanda patikrina, ar „DynamoDB“ pasiekiama pingo siuntimu į galutinį tašką, bandoma dar kartą, kol bus užmegztas ryšys. Toks klaidų apdorojimo lygis taupo laiką, nes užtikrina, kad paslaugos prasidėtų tinkama tvarka 🕒.
Galiausiai pakete package.json apibrėžėme pradėti scenarijus kaip mazgas dist/server.js. Ši komanda užtikrina, kad NPM tiksliai žinotų, kurį failą paleisti konteineryje, taip išvengiant klaidos „trūkstamas pradžios scenarijus“. Taip pat yra kūrimo komanda „TypeScript“ kodui kompiliuoti ir švari komanda dist aplankui pašalinti, užtikrinant, kad kiekvienas diegimas prasidėtų iš naujo. Naudojant tokius npm scenarijus, sąranka tampa patikimesnė, ypač kai dalyvauja Docker, nes siūlo nuspėjamus kelius ir veiksmus. Ši išsami Docker, Docker Compose ir NPM scenarijų konfigūracija veikia kartu, kad sukurtų supaprastintą kūrimo ir gamybos darbo eigą.
1 sprendimas: sureguliuokite „Dockerfile“ ir „Package.json“, kad būtų galima teisingai kopijuoti failus
Šis sprendimas naudoja Docker ir Node.js, kad užtikrintų, jog failai būtų tinkamai nukopijuoti į failą raj aplanką ir kad NPM gali rasti pradėti scenarijus.
# 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 sprendimas: pakeiskite docker-compose.yml aplinkos valdymui
Šis sprendimas pakeičia docker-compose.yml konfigūraciją, kad nurodytumėte teisingas komandas ir užtikrintumėte, kad scenarijai būtų tinkamai vykdomi „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 sprendimas: patikrinkite ir atnaujinkite Package.json scenarijus
Šis sprendimas apima užtikrinimą, kad pradėti scenarijus yra teisingai apibrėžtas package.json failą, kad išvengtumėte trūkstamų scenarijaus klaidų.
{
"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"
}
}
Įrenginio testai: scenarijaus ir dokerio konfigūracijos vientisumo užtikrinimas
Šie Jest testai patvirtina, kad pagrindiniai failai yra teisingai nukopijuoti ir NPM scenarijai veikia konteinerio aplinkoje.
// 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"\]/);
});
});
Tinkamo failų kopijavimo ir struktūros užtikrinimas programoje „Docker for Node.js“ projektams
Dirbant su Node.js programomis Docker, vienas iš pagrindinių aspektų yra užtikrinti, kad visi reikalingi failai būtų tinkamai nukopijuoti ir sudėti talpykloje. Kelių etapų versijose, kaip ir anksčiau pateiktame pavyzdyje, kiekvienas etapas turi konkretų tikslą. Pradinis etapas, „builder“, tvarko „TypeScript“ kompiliavimą į „JavaScript“ ir parengia raj aplanką. Antrajame etape įtraukiami tik gamybos failai, sumažinant konteinerio dydį ir optimizuojant diegimą. Šis metodas ne tik sumažina nereikalingą išsipūtimą, bet ir padidina saugumą, nes neįtraukiami kūrimo įrankiai.
Esminis Docker for Node.js aspektas yra organizuoti package.json ir pradžios scenarijus tiksliai. Aiškiai nurodydami kelius „Dockerfile“ ir užtikrindami, kad paleidimo komanda būtų tinkamai nustatyta package.json, sumažinate klaidas, pvz., „Trūksta pradžios scenarijaus“. Taip pat labai svarbu patvirtinti, kad „Docker“ žino, kur turi būti kiekvienas failas, ypač sudėtingose sąrankose, apimančiose kelias paslaugas ar aplankus. Pavyzdžiui, naudodami komandą COPY, kad pridėtumėte tik raj aplankas ir reikiamos konfigūracijos į galutinį konteinerį užtikrina, kad gamyboje būtų pasiekiami tik esminiai failai 📂.
Norėdami patikrinti savo paslaugų būklę, docker-compose.yml failas naudoja sveikatos patikrinimą, kad patikrintų, ar duomenų bazė yra paruošta. Apibrėždami priklausomybes, užtikriname, kad užpakalinės sistemos paslauga nebus paleista, kol duomenų bazė nereaguoja, taip užkertant kelią su laiku susijusių ryšio problemų. Ši sąranka ypač naudinga naudojant realaus pasaulio programas, kur duomenų bazės ryšys yra gyvybiškai svarbus. Be šios struktūros, paslaugos gali bandyti prisijungti prieš tai, kai kitos paslaugos veikia, todėl gali atsirasti vykdymo klaidų ir naudotojų prastovos 🔄.
Dažniausiai užduodami klausimai apie „Trūkstamo pradžios scenarijaus“ taisymą Node.js
- Kas sukelia NPM klaidą „trūksta pradžios scenarijaus“?
- Ši klaida dažnai įvyksta, kai package.json faile nėra a start apibrėžtas scenarijus. NPM negali rasti tinkamo įvesties taško programai paleisti.
- Ar package.json failas turi būti dist aplankas?
- Ne, package.json paprastai yra šakniniame kataloge ir tik būtini failai nukopijuojami į dist aplanką.
- Kodėl „Docker“ naudojame daugiapakopes versijas?
- Daugiapakopė konstrukcija leidžia mums sukurti lengvus, gamybai paruoštus konteinerius. Atskirdami kūrimo ir vykdymo aplinkas, pašalinami nereikalingi failai, o tai pagerina saugumą ir efektyvumą.
- Kaip veikia healthcheck „Docker Compose“ pagalba?
- The healthcheck komanda patikrina, ar paslauga yra sukurta ir veikia, o tai būtina tais atvejais, kai pirmiausia reikia paruošti priklausomas paslaugas, pvz., duomenų bazes.
- Ar galiu naudoti kitas duomenų bazes vietoj DynamoDB šioje sąrankoje?
- Taip, galite pakeisti DynamoDB su kitomis duomenų bazėmis. Sureguliuokite „Docker Compose“ konfigūraciją, kad ji atitiktų jūsų pageidaujamą duomenų bazės paslaugą.
- Kodėl mes naudojame RUN npm install --omit=dev komandą?
- Ši komanda diegia tik gamybos priklausomybes, o tai padeda išlaikyti lengvą konteinerį, neįtraukiant kūrimo įrankių.
- Kaip galiu patvirtinti dist ar teisingai nukopijuotas aplankas?
- Savo kode galite pridėti testą, kad patikrintumėte, ar dist egzistuoja arba naudokite „Docker“ CLI, kad patikrintumėte konteinerio turinį po sukūrimo.
- Ar turiu nurodyti prievadą ir Dockerfile, ir Docker Compose?
- Taip, nurodant prievadą abiejuose, užtikrinama, kad konteinerio prievadas sutampa su pagrindinio prievado prievadu, todėl paslauga pasiekiama iš išorės „Docker“.
- Kodėl yra nustatymas WORKDIR ar Docker svarbu?
- Nustatymas WORKDIR sukuria numatytąjį katalogo kelią visoms komandoms, supaprastina failų kelius ir sistemingai tvarko konteinerio failus.
- Kaip peržiūrėti „Docker“ žurnalus, kad būtų galima derinti šią klaidą?
- Naudokite docker logs [container_name] pasiekti žurnalus, kurie gali suteikti įžvalgų apie paleisties klaidas arba trūkstamus failus.
„Node.js“ paleidimo klaidų taisymas programoje „Docker“.
Norint išspręsti „trūkusio pradžios scenarijaus“ klaidą, reikia atkreipti dėmesį į detales, ypač konfigūruojant „Docker“ failų struktūrą ir NPM scenarijus. Patikrinkite savo Dockerfile, kad įsitikintumėte, jog sukompiliuoti failai yra nukopijuoti į raj aplanką ir kad paleidimo scenarijus pakete.json yra teisingai apibrėžtas, galite sutaupyti valandų derinimo.
Aiškios sąrankos ir organizuotų scenarijų palaikymas padės „Docker“ konteineriams veikti be problemų, o naudojant „Docker Compose“ sveikatos patikrinimus paslaugos įkeliamos tinkama tvarka. Su šiais koregavimais jūsų užpakalinė programa turėtų prasidėti patikimai, todėl kūrimo darbo eiga bus sklandesnė. 🛠️
Šaltiniai ir nuorodos
- Išsami informacija apie „Docker“ kelių etapų kūrimą ir geriausią „Node.js“ programų praktiką „Docker“: Docker dokumentacija
- Išsamus sveikatos patikrinimų ir priklausomybių nustatymo „Docker Compose“ vadovas, siekiant užtikrinti, kad paslaugos būtų pradėtos tinkama tvarka: „Docker Compose“ sveikatos patikrinimas
- „Trūkstamo pradžios scenarijaus“ klaidų ir kitų įprastų NPM problemų šalinimas, įskaitant tinkamą package.json konfigūravimą gamybinėms versijoms: NPM dokumentacija
- Įvadas į „DynamoDB Local“ konfigūravimą ir testavimą „Docker“ aplinkose, įskaitant naudojimą su „Node.js“ foninėmis programomis: AWS DynamoDB vietos vadovas