上下文
最近,我一直在尝试将我的角度构建封装起来,因为我将前端和后端一起部署在一个映像中。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。这当然是有意的行为,但它每次都会重新编译角库代码,而不是缓存编译的结果(就像从本地shell执行npm run build时一样)。我正在寻找一种方法来缓存编译角库代码的结果,所以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更改时才会编译角位,而不是每次我接触前端代码中的某个文件时。
不幸的是,据我所知,在角CLI中没有专门编译角库代码的命令,而忽略了用户代码。而且,我读过的所有教程都没有提到重新编译的问题,所以我可能在这里遗漏了什么。尽管如此,我很难想象我是第一个遇到这个问题的人,我想至少应该有一个解决办法。因此,概括地说:
发布于 2021-09-10 12:28:09
经过长时间的搜索,我在第17017期存储库中找到了有关角巩膜的信息。针对该问题的其中一条评论提到,有一种方法可以触发ESM编译:./node_modules/.bin/ngcc --properties es2015。有了这些知识,我修改了我的Dockerfile,它工作起来就像一种魅力,不再在每次更改自己的代码时重新编译角库代码:
# 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"]https://stackoverflow.com/questions/69109540
复制相似问题