【发布时间】: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.json或package-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.json 或package-lock.json 更改时编译角度位,而不是每次我在前端代码中触摸某个文件时。
不幸的是,据我所知,Angular CLI 中没有专门编译 Angular 库代码的命令,而将用户代码放在一边。此外,我阅读的所有教程都没有提到重新编译的问题,所以我可能在这里遗漏了一些东西。不过,我很难想象我是第一个遇到这个问题的人,我认为至少必须有一个解决方法。所以,总结一下:
- 有没有办法避免在像我这样的 dockerized 设置中重新编译 Angular 库代码?
- 如果没有,是否至少有一种解决方法,可能是通过在 Docker 之外执行构建步骤?
【问题讨论】: