我正在尝试在自定义图片(基于官方节点图片)中构建新的angular 9项目。基本上,我想缓存程序包构建,而不是角度源构建。
下面是我的Dockerfile
FROM node
COPY package.json /mnt/
RUN cd /mnt/ && npm install && npm audit fix && npm install -g @angular/cli
ENV PATH /mnt/node_modules/.bin:$PATH
RUN mkdir /mnt/project
WORKDIR /mnt/project
ENTRYPOINT ["/bin/bash", "run.sh"]
我创建了一个新的angular 9项目,我复制了上面的docker文件和run.sh文件(稍后介绍),并创建了图像angular-cache-image。而且我还更新了node_module目录路径的angular.json和tsconfig.json文件(将node_modules
替换为../node_modules
)。我已经从本地项目目录中删除了dist和node_modules目录。
现在,我将带有绑定安装的容器运行到容器位置/ mnt / project,并在入口点中运行build命令。 (请注意,在容器中,node_modules不在角度项目直接性内)
docker container run -it --rm --name angular-cache-test -v $(pwd):/mnt/project --user $(id -u):$(id -g) angular-cache-image
run.sh目前仅具有build命令(假设以后再做更多事情)
#!/bin/bash
npm -v
node -v
ng build --prod
但是我遇到了错误
6.13.7
v13.10.1
ERROR in ../node_modules/@angular/platform-browser/platform-browser.d.ts:44:22 - error NG6002: Appears in the NgModule.imports of AppModule, but could not be resolved to an NgModule class.
This likely means that the library (@angular/platform-browser) which declares BrowserModule has not been processed correctly by ngcc, or is not compatible with Angular Ivy. Check if a newer version of the library is available, and update if so. Also consider checking with the library's authors to see if the library is expected to be compatible with Ivy.
44 export declare class BrowserModule {
~~~~~~~~~~~~~
以下是我的本地计算机角度版本的详细信息:
Angular CLI: 9.0.2
Node: 12.18.0
OS: linux x64
Angular: <error>
... animations, cli, common, compiler, compiler-cli, core, forms
... language-service, platform-browser, platform-browser-dynamic
... router
Ivy Workspace: Yes
Package Version
---------------------------------------------------------
@angular-devkit/architect 0.900.2 (cli-only)
@angular-devkit/build-angular <error>
@angular-devkit/core 9.0.2 (cli-only)
@angular-devkit/schematics 9.0.2 (cli-only)
@schematics/angular 9.0.2 (cli-only)
@schematics/update 0.900.2 (cli-only)
rxjs 6.5.3 (cli-only)
typescript <error>
本地npm版本为6.14.4
我试图通过禁用ivy编译来解决问题,但是无法解决。赞赏有人可以帮助我解决这个问题吗?
答案 0 :(得分:2)
您以错误的用户身份运行构建命令。
映像正在执行的操作是安装依赖项,并以root身份安装npm。但是,您要通过以非root用户身份执行构建脚本,方法是传入--user
标志,然后以该用户身份在入口点脚本中运行ng build命令。
如果您以非NPM安装用户的身份进行编译,则Ivy无法正常工作。我还没有深入研究Ivy的内部原理,无法确切地告诉您原因,但这就是正在发生的情况。
要解决此问题,您可以并且应该将构建脚本移入Dockerfile中并摆脱入口点;无论如何,这都不是入口点。构建的映像应包含构建的应用程序,因此应在构建时而不是运行时运行。