如何将“npm install”集成到 ASP.NET CORE 2.1 Docker构建中

23

我还没有找到在构建ASP.NET Core 2.1 Docker镜像时进行正确的npm install安装的方法。

我的Dockerfile是以下内容(是从Visual Studio生成的):

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY --from=frontend . .
COPY ["myProject.WebUi/myProject.WebUi.csproj", "myProject.WebUi/"]
COPY ["myProject.SearchIndex/myProject.SearchIndex.csproj", "myProject.SearchIndex/"]
COPY ["myProject.SearchIndex.Common/myProject.SearchIndex.Common.csproj", "myProject.SearchIndex.Common/"]

RUN dotnet restore "myProject.WebUi/myProject.WebUi.csproj"
COPY . .
WORKDIR "/src/myProject.WebUi"
RUN dotnet build "myProject.WebUi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "myProject.WebUi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "myProject.WebUi.dll"]

在之前的 Microsoft 图像中(例如 aspnetcore-build:2.0),提供了第三方工具,如 npm、yarn、bower、pip 等)

目前我在项目文件夹中执行本地的 npm install。但是,对于像 Docker Hub 或 Azure Container Registry 提供的自动构建,缺少注释模块。


1
我会在 WORKDIR "/src/myProject.WebUi" 后添加 RUN npm install。如果基础镜像中没有 npm,则在其之前也要添加 RUN apt-get update && apt-get install -y nodejs - qbik
@qbik 谢谢,我想你的建议是正确的方向。但是安装nodejs并不会安装npm。而类似于“apt-get install npm”的命令也不可用。 - dannyyy
3个回答

36

找到了解决方案:

FROM microsoft/dotnet:2.1-aspnetcore-runtime AS base
WORKDIR /app
EXPOSE 80

FROM microsoft/dotnet:2.1-sdk AS build
WORKDIR /src
COPY --from=frontend . .
COPY ["myProject.WebUi/myProject.WebUi.csproj", "myProject.WebUi/"]
COPY ["myProject.SearchIndex/myProject.SearchIndex.csproj", "myProject.SearchIndex/"]
COPY ["myProject.SearchIndex.Common/myProject.SearchIndex.Common.csproj", "myProject.SearchIndex.Common/"]

RUN dotnet restore "myProject.WebUi/myProject.WebUi.csproj"
COPY . .
WORKDIR "/src/myProject.WebUi"
RUN apt-get update -yq && apt-get upgrade -yq && apt-get install -yq curl git nano
RUN curl -sL https://deb.nodesource.com/setup_8.x | bash - && apt-get install -yq nodejs build-essential
RUN npm install -g npm
RUN npm install
RUN dotnet build "myProject.WebUi.csproj" -c Release -o /app

FROM build AS publish
RUN dotnet publish "myProject.WebUi.csproj" -c Release -o /app

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "myProject.WebUi.dll"]

3
似乎Debian 9(stretch)默认的“nodejs” apt软件包不包含“npm”。Node在其网站上提供了详细说明,以安装不同操作系统上的Node(https://nodejs.org/en/download/package-manager/#debian-and-ubuntu-based-linux-distributions)。 - qbik
@qbik 如何在 Windows 容器中解决相同的任务? - Sergey Nikitin

23

使用SPA更新ASP.NET Core 3.0 Web应用程序

FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS build
WORKDIR /app

# Prevent 'Warning: apt-key output should not be parsed (stdout is not a terminal)'
ENV APT_KEY_DONT_WARN_ON_DANGEROUS_USAGE=1

# install NodeJS 13.x
# see https://github.com/nodesource/distributions/blob/master/README.md#deb
RUN apt-get update -yq 
RUN apt-get install curl gnupg -yq 
RUN curl -sL https://deb.nodesource.com/setup_13.x | bash -
RUN apt-get install -y nodejs

# copy csproj and restore as distinct layers
COPY *.sln .
COPY MyApplication/*.csproj ./MyApplication/
RUN dotnet restore

# copy everything else and build app
COPY MyApplication/. ./MyApplication/
WORKDIR /app/MyApplication
RUN dotnet publish -c Release -o out

FROM mcr.microsoft.com/dotnet/core/aspnet:3.0 AS runtime
WORKDIR /app
COPY --from=build /app/MyApplication/out ./
ENTRYPOINT ["dotnet", "MyApplication.dll"]

然后。
docker build --pull -t MyApplication
docker run --name myapp --rm -it -p 8000:80 MyApplication

该应用程序将在 localhost:8000 上提供。

1
你是最棒的。非常感谢,我一整天都在尝试让它运行! - Dimitar Dimitrov
1
我可能错了,因为我刚开始学习Docker,但是看起来ENV行有两个ENV,而它只应该有一个? - DaleyKD
谢谢Shaun!真巧,我正在寻找这个问题并找到了你的答案(还记得我是来自LT的吗?)。问题:鉴于Docker缓存每个层,您是否知道如果更改package.json是否会在容器中反映出来(即node_modules/文件夹相应地添加/更新/删除),而无需清除层缓存? - ablopez
的确巧合,@ablopez,恐怕我不知道你后续问题的答案。 - Shaun Luttin

7
在我的情况下,我需要运行一个包含能够执行类似于“dotnet xxx.xxx.dll”脚本的NodeJS项目的Docker镜像。
我一直在努力解决docker内部的“dotnet命令未找到”的问题。
我成功地通过在我的Dockerfile开头添加以下内容来轻松解决它:
FROM node:alpine AS node_base
FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build-env
COPY --from=node_base . .

RUN echo "NODE Version:" && node --version
RUN echo "NPM Version:" && npm --version
RUN echo "dotnet Version:" &&  dotnet --version

(您可以相应地调整版本)

我从这个Github问题中获得了灵感。

希望这个技巧也能帮到您 :)


5
运行命令 COPY --from=node_base . . 时出现错误 cannot copy to non-directory: /var/lib/docker/overlay2/cxre60io3tls1hmjs5xpgd6iy/merged/var/lock,可能是由于无法将文件复制到非目录的原因导致的。 - M. Azyoksul
对我而言,当我用node:latest替换node:alpine时它有效了(顺便说一句:这是在引用问题中使用的镜像,而不是alpine版本)。 - Zoka

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接