Top 4 tactici pentru a păstra Rockin ’în Docker - Docker Blog

Cu toții avem limbile și cadrele noastre preferate, iar Node.js este cel mai bun lucru pentru mine. Am rulat Node.js în Docker încă din primele zile pentru aplicații critice pentru misiune. Am misiunea de a educa pe toată lumea cu privire la modul de a profita la maximum de acest cadru și instrumentele sale precum npm, Yarn și nodemon cu Docker.
Există o mulțime de informații despre utilizarea Node.js cu Docker, dar atât de mult este depășit de ani, și sunt aici pentru a vă ajuta să vă optimizați setările pentru Node.js 10+ și Docker 18.09+. Dacă preferați să urmăriți discuția mea despre DockerCon 2019 care acoperă aceste subiecte și multe altele, consultați-o pe YouTube.
Să parcurgem 4 pași pentru a face ca containerele dvs. Node.js să cânte! Voi include câteva „Prea mult; Nu am citit ”pentru cei care au nevoie de el.
Rămâneți cu distribuția actuală de bază
TL; DR: Dacă migrați aplicațiile Node.js în containere, utilizați imaginea de bază a sistemului de operare gazdă pe care îl aveți în producție astăzi. După aceea, imaginea mea de bază preferată este nodul oficial: ediții subțiri, mai degrabă decât nodul: alpin, care este încă bun, dar, de obicei, mai multă muncă de implementat și vine cu limitări.
Una dintre primele întrebări pe care cineva le pune atunci când pune o aplicație Node.js în Docker este „Din ce imagine de bază ar trebui să pornesc fișierul Docker Node.js?”
subțire și alpin sunt destul de mici decât imaginea implicită Există mai mulți factori care influențează acest lucru, dar nu faceți din „dimensiunea imaginii” o prioritate, cu excepția cazului în care aveți de-a face cu IoT sau dispozitive încorporate în care fiecare MB contează. În ultimii ani, imaginea subțire a scăzut ca dimensiune la 150 MB și funcționează cel mai bine în cel mai larg set de scenarii. Alpine este o distribuție de containere foarte minimă, cu cea mai mică imagine a nodului la doar 75 MB. Cu toate acestea, nivelul efortului de a schimba managerii de pachete (apt pentru apk), de a trata cazurile marginale și de a rezolva limitele de scanare a securității mă face să renunț la recomandarea nodului: alpin pentru majoritatea cazurilor de utilizare.
Când adoptați tehnologia containerelor, ca orice altceva, doriți să faceți tot ce puteți pentru a reduce rata de schimbare. Atât de multe instrumente și procese noi vin împreună cu containerele. Alegerea imaginii de bază dev-urile și operațiunile dvs. sunt cele mai utilizate pentru a avea multe beneficii neașteptate, deci încercați să rămâneți cu el atunci când are sens, chiar dacă acest lucru înseamnă să creați o imagine personalizată pentru CentOS, Ubuntu etc.
Tratarea modulelor nodului
TL; DR: Nu trebuie să mutați node_modules în containerele dvs., atâta timp cât respectați câteva reguli pentru o dezvoltare locală adecvată. O a doua opțiune este să mutați mode_modules în sus într-un director în fișierul Docker, să vă configurați containerul corect și va oferi cea mai flexibilă opțiune, dar este posibil să nu funcționeze cu fiecare cadru npm.
Acum suntem cu toții obișnuiți cu o lume în care nu scriem tot codul pe care îl rulăm într-o aplicație și asta înseamnă să ne ocupăm de dependențele cadrului aplicației. O întrebare comună este cum să gestionăm aceste dependențe de cod din containere atunci când acestea sunt un subdirector al aplicației noastre. Bind-mount-urile locale pentru dezvoltare vă pot afecta aplicația în mod diferit dacă aceste dependențe au fost proiectate să ruleze pe sistemul dvs. de operare gazdă și nu pe sistemul de operare container.
Nucleul acestei probleme pentru Node.js este că node_modules poate conține binare compilate pentru sistemul de operare gazdă și, dacă este diferit de sistemul de operare al containerului, veți primi erori încercând să rulați aplicația atunci când o legați-montând din gazdă pentru dezvoltare. Rețineți că, dacă sunteți un dezvoltator Linux pur și vă dezvoltați pe Linux x64 pentru Linux x64, această problemă legată de montare nu este de obicei o problemă.
Pentru Node.js vă ofer două abordări, care vin cu propriile avantaje și limitări:
Soluția A: Păstrați-l simplu
Nu mutați node_modules. Va rămâne în continuare în subdirectorul implicit al aplicației dvs. în container, dar acest lucru înseamnă că trebuie să împiedicați folosirea node_module create pe gazda dvs. în container în timpul dezvoltării.
Aceasta este metoda mea preferată atunci când fac dezvoltare pure-Docker. Funcționează excelent cu câteva reguli pe care trebuie să le respectați pentru dezvoltarea locală:
- Dezvoltați numai prin container. De ce? Practic, nu doriți să amestecați node_modules de pe gazda dvs. cu node_modules în container. Pe macOS și Windows, Docker Desktop leagă codul dvs. de-a lungul barierei sistemului de operare și acest lucru poate provoca probleme cu binarele pe care le-ați instalat cu npm pentru sistemul de operare gazdă, care nu pot fi rulate în containerul sistemului de operare.
- Rulați toate comenzile dvs. npm prin docker-compose. Aceasta înseamnă că instalarea inițială a NPM pentru proiectul dvs. ar trebui acum să fie instalată docker-compose run npm install .
Soluția B: Mutați modulele container și ascundeți modulele gazdă
Mutați node_modules pe calea fișierului în fișierul Docker, astfel încât să puteți dezvolta Node.js în interiorul și în afara containerului, iar dependențele nu vor intra în conflict, pe care le comutați între dezvoltarea nativă a gazdei și dezvoltarea bazată pe Docker.