【问题标题】:How to integrate 'npm install' into ASP.NET CORE 2.1 Docker build如何将“npm install”集成到 ASP.NET CORE 2.1 Docker 构建中
【发布时间】:2019-01-25 21:14:55
【问题描述】:

在构建过程中执行正确的npm install 时,我还没有找到构建 ASP.NET Core 2.1 Docker 映像的方法。

我的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 提供的自动构建,则缺少注释模块。

【问题讨论】:

  • 我会在WORKDIR "/src/myProject.WebUi" 之后添加RUN npm install。如果基础镜像中没有npm,那么还要在它前面加上RUN apt-get update && apt-get install -y nodejs
  • @qbik 谢谢,我想你的建议朝着正确的方向发展。但是安装 nodejs 并不会安装 npm。像apt-get install npm 这样的东西不可用。

标签: docker npm asp.net-core dockerfile


【解决方案1】:

找到解决方案:

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"]

【讨论】:

  • Debian 9 (stretch) 的默认nodejs apt 包似乎不包括npm。 Node 在不同的操作系统上有一个detailed instruction for installing
  • @qbik windows 容器如何解决相同的任务?
【解决方案2】:

带有 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 提供。

【讨论】:

  • 你是最棒的。谢谢一百万,我整天都在努力让它运行!
  • 我可能是错的,因为我刚刚学习 Docker,但 ENV 行似乎有两个 ENV,而它应该只有一个?
  • 谢谢肖恩!如此巧合,我一直在寻找这个问题并找到了您的答案(还记得我从 LT 吗?)。问题:鉴于 Docker 缓存每一层,您是否知道对 package.json 的更改是否会反映在容器中(即相应地添加/更新/删除 node_modules/ 文件夹)而无需清除层缓存?
  • 巧合确实@ablopez,恐怕我不知道你后续问题的答案。
【解决方案3】:

就我而言,我需要一个运行 nodeJS 项目的 docker 映像,该项目能够执行诸如“dotnet xxx.xxx.dll”之类的脚本。

我正在努力尝试在我的 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 issue中获得灵感。

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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2021-05-08
    • 2015-01-26
    • 2016-06-16
    • 2020-10-14
    • 1970-01-01
    • 2018-03-28
    • 2019-10-09
    相关资源
    最近更新 更多