Docker: "npm not found"

Docker: "npm not found"

我正在尝试将 ASP.NET Core 和 Angular 应用程序容器化,但我遇到了一些麻烦。

我遇到了这些错误:

 => [internal] load build definition from Dockerfile                                                               0.4s
 => => transferring dockerfile: 872B                                                                               0.1s
 => [internal] load .dockerignore                                                                                  0.4s
 => => transferring context: 35B                                                                                   0.0s
 => [internal] load metadata for mcr.microsoft.com/dotnet/sdk:5.0                                                  0.5s
 => [internal] load metadata for mcr.microsoft.com/dotnet/aspnet:5.0                                               0.0s
 => [base 1/7] FROM mcr.microsoft.com/dotnet/aspnet:5.0                                                            0.0s
 => [build 1/7] FROM mcr.microsoft.com/dotnet/sdk:5.0@sha256:b69acf0a0734d77827d4e7ce22421256a64d490bb3ce988b21c4  0.0s
 => [internal] load build context                                                                                  0.3s
 => => transferring context: 3.17kB                                                                                0.0s
 => CACHED [base 2/7] WORKDIR /app                                                                                 0.0s
 => CACHED [base 3/7] RUN apt-get -y update                                                                        0.0s
 => CANCELED [base 4/7] RUN apt-get -y upgrade                                                                     5.6s
 => CACHED [build 2/7] WORKDIR /src                                                                                0.0s
 => CACHED [build 3/7] COPY [mediere.csproj, .]                                                                    0.0s
 => CACHED [build 4/7] RUN dotnet restore "./mediere.csproj"                                                       0.0s
 => CACHED [build 5/7] COPY . .                                                                                    0.0s
 => CACHED [build 6/7] WORKDIR /src/.                                                                              0.0s
 => CACHED [build 7/7] RUN dotnet build "mediere.csproj" -c Release -o /app/build                                  0.0s
 => ERROR [publish 1/1] RUN dotnet publish "mediere.csproj" -c Release -o /app/publish                             4.7s
------
 > [publish 1/1] RUN dotnet publish "mediere.csproj" -c Release -o /app/publish:
#21 1.567 Microsoft (R) Build Engine version 16.11.2+f32259642 for .NET
#21 1.567 Copyright (C) Microsoft Corporation. All rights reserved.
#21 1.567
#21 2.460   Determining projects to restore...
#21 2.852   All projects are up-to-date for restore.
#21 3.883   mediere -> /src/bin/Release/net5.0/mediere.dll
#21 3.894   mediere -> /src/bin/Release/net5.0/mediere.Views.dll
#21 4.006   /bin/sh: 2: /tmp/tmp045a9cb1e4954d54b304a781ae210094.exec.cmd: npm: not found
#21 4.011 /src/mediere.csproj(38,5): error MSB3073: The command "npm install" exited with code 127.
------
executor failed running [/bin/sh -c dotnet publish "mediere.csproj" -c Release -o /app/publish]: exit code: 1

我的 dockerfile 是这样的:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 5000
#EXPOSE 5001

RUN apt-get -y update
RUN apt-get -y upgrade
RUN apt install -y curl
RUN curl -sL https://deb.nodesource.com/setup_12.x | bash - 
RUN apt-get install -y nodejs build-essential

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["mediere.csproj", "."]
RUN dotnet restore "./mediere.csproj"
COPY . .
WORKDIR "/src/."
RUN dotnet build "mediere.csproj" -c Release -o /app/build

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

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

我希望它能工作,因为我正在第 12 行安装 npm。

我观察到发布任务和 apt-get 安装任务同时工作,我认为发布在 apt-get 安装之前进行,这就是它不起作用的原因。不过我可能是错的。

我该如何解决这个错误?

谢谢。

每个 Dockerfile 构建阶段都会启动 FROM 一些其他映像。在您使用 Node 时,构建阶段是

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
...
FROM build AS publish
RUN dotnet publish "mediere.csproj" -c Release -o /app/publish

在这个特定的包序列中,从 .NET SDK 映像开始一直到您 运行 dotnet publish,但这从未真正安装 Node。

安装 Node 的地方是 base 图像阶段。这包含在 final 图像中,但不包含在任何中间构建步骤中。

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
RUN apt-get install -y nodejs
FROM base AS final

如果您将 Angular 应用程序构建到静态文件中,然后从 .NET 应用程序为其提供服务,则您只需要在 build-and-publish 阶段使用 Node,而不是在最终应用程序中。我建议在 FROM ... AS build 行之后立即安装它,特别是在 COPY 任何东西进入图像之前。如果由于代码更改而重建映像,这将避免重新安装 Node。

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
# do not install Node here

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
# Do install Node
# The default version in the Debian repositories should be fine
RUN apt-get update \
 && DEBIAN_FRONTEND=noninteractive \
    apt-get install --no-install-recommends --assume-yes \
      build-essential \
      nodejs

# Build your application as before
WORKDIR /src
...

FROM build AS publish
# Will include Node, because the `FROM ... AS build` stage installed it

FROM base AS final
# Will not include Node, because the `FROM ... AS base` stage did not
# install it