Dra*_*man 4 shared-libraries node-modules typescript docker angular
我仍在对我们的微前端应用程序进行 Docker 化。目前我们使用 React 和 Angular 以及共享库进行通信。该库是我们自己开发的,通过npm安装在本地。
'- angular-project
'- react-projects
'- shared-libs
'- communication-lib
Run Code Online (Sandbox Code Playgroud)
我们正在本地安装通信库
npm install ..\shared-libs\communication-lib
Run Code Online (Sandbox Code Playgroud)
在本地运行一切工作正常。但当我们转向 docker 时,出现了几个问题,我无法找到一个好的解决方案。下面是 Angular 项目 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
Run Code Online (Sandbox Code Playgroud)
这就是 docker 失败的地方,因为 docker 镜像不知道该库。我还添加了一个卷来与该映像共享共享库的代码,但是我仍然存在没有已构建的node_module 的问题。
如果有人能为我提供一些如何解决此问题的有用提示,我真的很感激。
我的想法:
是否可以以某种方式为库创建一个独立的 docker 并在我的角度项目容器中使用这些容器?
我可以以某种方式复制/构建并链接容器内的库吗?
你不能完全做你想做的事,但还有其他选择......
当您通过添加本地包时,npm install ../<folder>它会在该文件夹内部创建一个符号链接(symlink)node_modules,而不是实际将内容复制../<folder>到您的node_modules. 这样做是为了如果您在链接的包中进行更新,它会实时无缝地反映在您的项目中。
当您运行时docker build,它将构建上下文发送给守护进程。构建上下文的根是它所Dockerfile在的位置。这意味着守护进程无法访问构建上下文之外的文件系统上的任何文件夹;即Dockerfile位于其中的aangular-project将导致守护程序无法访问该shared-libs文件夹,因此您将无法从那里复制任何内容。
这也是为什么 aCOPY或ADDa 内的命令Dockerfile不能遵循构建上下文之外的符号链接的原因。这意味着它将无法将该内容复制到图像中。
Dockerfile您可以做的一件事是将 移动到包含所有Dockerfile所需软件包的文件夹,即在您的情况下,将 和文件夹所在的文件夹放在上面。这当然会使其他事情变得复杂,例如选择要构建的内容以及其中的命令,以便它们将正确的项目复制到图像中。angular-projectshared-libsDockerfileDockerfile
另一种选择是打包communication-lib( npm pack ..\shared-libs\communication-lib),然后引用 tarball ( npm install communication-lib.tgz) angular-project。看这里。.gitignore如果您不想签入,可以将 tarball 添加到您的文件中,但是您必须npm pack在第一次构建以及每次共享库更新时运行该命令。
| 归档时间: |
|
| 查看次数: |
651 次 |
| 最近记录: |