angular - länka eller installera lokal typescript-bibliotek inuti docker-behållare
Jag håller fortfarande på att dockerisera vår microfrontend-applikation. För närvarande använder vi React och Angular och ett delat bibliotek för kommunikationen. Biblioteket är utvecklat av oss själva och installerat lokalt via npm.
'- angular-project
'- react-projects
'- shared-libs
'- communication-lib
Vi installerar kommunikationsbiblioteket lokalt med
npm install ..\shared-libs\communication-lib
Att köra allt lokalt fungerar bra. Men när vi går över till Docker finns det flera problem och jag kan inte komma på en bra lösning. Nedan är de första raderna i Angular-projektets Dockerfile
FROM node:16-alpine As development
WORKDIR /usr/src/app/frontend
COPY ./angular/package.json ./angular/package-lock.json ./
RUN npm i
...
already crashed here
Det här är punkten där docker misslyckas eftersom biblioteket inte är känt för docker-bilden. Jag lade också till en volym för att dela koden för det delade biblioteket med denna bild, men då har jag fortfarande problemet med att inte ha en redan byggd node_module.
Jag är verkligen tacksam om någon kunde ge mig några användbara tips om hur man löser detta problem.
Mina tankar:
Är det på något sätt möjligt att skapa en fristående Docker för biblioteken och använda dessa container i min Angular-projekts container?
Kan jag på något sätt kopiera/bygga och länka biblioteket inne i containern?
Svar #1
Sammanfattning
Du kan inte göra exakt vad du vill, men det finns alternativ...
Förklaring
Historien om den lokala paketlänken
När du lägger till ett lokalt paket via npm install ../<folder> skapas en symbolisk länk (symlink) inuti node_modules till den mappen istället för att faktiskt kopiera innehållet från ../<folder> till dina node_modules. Det görs så att om du gör en uppdatering i ditt länkade paket, reflekteras det sömlöst i ditt projekt i realtid.
Docker-byggberättelsen
När du kör docker build skickar det byggkontexten till daemonen. Roten av byggkontexten är där Dockerfile är placerad. Det betyder att daemonen inte har åtkomst till någon mapp på filsystemet utanför byggkontexten; dvs. en Dockerfile som är placerad inuti angular-project kommer att göra att daemonen inte kan få åtkomst till mappen shared-libs, så du kommer inte kunna kopiera något därifrån.
Detta är också anledningen till varför ett COPY- eller ADD-kommando i en Dockerfile inte kan följa symboliska länkar utanför byggkontexten. Det betyder att det inte skulle kunna kopiera det innehållet till bilden.
Lösningar
Flytta upp Dockerfile
En sak du kan göra är att flytta Dockerfile till en mapp som innehåller alla dina förväntade paket, dvs. i ditt fall en mapp upp där både angular-project finns såväl som shared-libs-mappen. Detta skulle förstås komplicera andra saker som att välja Dockerfile att bygga, samt kommandona inuti Dockerfile så att de kopierar de korrekta objekten och endast dem till bilden.
Packa lokal paket
Ett annat alternativ är att packa communication-lib (npm pack ..\shared-libs\communication-lib) och sedan referera till tarballen (npm install communication-lib.tgz) i angular-project istället. Se här. Du kan lägga till tarballen i din .gitignore om du inte vill checka in den, men du måste köra npm pack-kommandot vid första byggning och varje gång det finns en uppdatering av det delade biblioteket.