【问题标题】:Containerized Angular build recompiling every time容器化的 Angular 构建每次都重新编译
【发布时间】:2021-11-05 14:37:42
【问题描述】:

上下文

最近我一直在尝试将我的 Angular 构建容器化,因为我将前端和后端一起部署在单个映像中。 Dockerfile如下:

# Build frontend
FROM node:16 AS node-build
WORKDIR /app

COPY frontend/package.json frontend/package-lock.json ./
RUN npm install

COPY frontend .
RUN npm run build

# Build backend
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS dotnet-build
WORKDIR /app

COPY backend ./
RUN dotnet restore Api
RUN dotnet publish Api -c Release -o out

# Build runtime image
FROM mcr.microsoft.com/dotnet/aspnet:5.0
WORKDIR /app
COPY --from=dotnet-build /app/out .
COPY --from=node-build /app/dist/film-portal wwwroot/

ENTRYPOINT ["dotnet", "Api.dll"]

问题

上面的 Dockerfile 完美地构建了有问题的镜像,部署后它就像一个魅力。但是,构建需要的时间比我想要的要多。让我解释一下:

  • npm install 仅在 package.jsonpackage-lock.json 发生更改时运行。这很棒,而且可以节省时间。
  • npm run build 在前端代码被触动时运行。这当然是预期的行为,但它每次都会重新编译 Angular 库代码,而不是缓存编译结果(就像你在本地 shell 中执行 npm run build 时的情况一样)。

我正在寻找一种方法来缓存编译 angular 库代码的结果,因此npm run build 只需构建我自己的代码(花费更少的时间来完成)。在虚构的语法中,我需要在我的 Dockerfile 中为前端阶段提供类似以下内容:

FROM node:16 AS node-build
WORKDIR /app

COPY frontend/package.json frontend/package-lock.json ./
RUN npm install
RUN npm compile-angular

COPY frontend .
RUN npm run build

这里npm compile-angular 只会在package.jsonpackage-lock.json 更改时编译角度位,而不是每次我在前端代码中触摸某个文件时。

不幸的是,据我所知,Angular CLI 中没有专门编译 Angular 库代码的命令,而将用户代码放在一边。此外,我阅读的所有教程都没有提到重新编译的问题,所以我可能在这里遗漏了一些东西。不过,我很难想象我是第一个遇到这个问题的人,我认为至少必须有一个解决方法。所以,总结一下:

  1. 有没有办法避免在像我这样的 dockerized 设置中重新编译 Angular 库代码?
  2. 如果没有,是否至少有一种解决方法,可能是通过在 Docker 之外执行构建步骤?

【问题讨论】:

    标签: angular docker


    【解决方案1】:

    经过长时间的搜索,我在 angular-cli 存储库中找到了 Issue 17017One of the comments 该问题提到有一个黑客可以触发 ESM 编译:./node_modules/.bin/ngcc --properties es2015。有了这些知识,我修改了我的 Dockerfile,它就像一个魅力,不再在每次更改我自己的代码时重新编译 Angular 库代码:

    # Build frontend
    FROM node:16 AS node-build
    WORKDIR /app
    
    COPY frontend/package.json frontend/package-lock.json ./
    RUN npm ci
    
    # Hack to make sure the angular modules are compiled at this stage
    RUN ./node_modules/.bin/ngcc --properties es2015
    
    COPY frontend .
    RUN npm run build
    
    # Build backend
    FROM mcr.microsoft.com/dotnet/sdk:5.0 AS dotnet-build
    WORKDIR /app
    
    COPY backend ./
    RUN dotnet restore Api
    RUN dotnet publish Api -c Release -o out
    
    # Build runtime image
    FROM mcr.microsoft.com/dotnet/aspnet:5.0
    WORKDIR /app
    COPY --from=dotnet-build /app/out .
    COPY --from=node-build /app/dist/film-portal wwwroot/
    
    ENTRYPOINT ["dotnet", "Api.dll"]
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-05-20
      • 1970-01-01
      • 2020-06-04
      • 1970-01-01
      • 2021-02-25
      • 1970-01-01
      • 2022-07-23
      • 2020-08-28
      相关资源
      最近更新 更多