Докер: «npm не найден»

Я пытаюсь контейнеризировать приложение 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

Мой докерфайл таков:

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

Я ожидал, что это сработает, потому что я устанавливаю npm в строке 12.

Я заметил, что задача публикации и задача установки apt-get работают одновременно, и я думаю, что публикация предшествует установке apt-get, и поэтому она не работает. Хотя я могу ошибаться.

Как я могу исправить эту ошибку?

Спасибо.

попробуйте использовать это: RUN apt-get install -y nodejs npm вместо: RUN apt-get install -y nodejs build-essential

Amara Miloudi 23.04.2022 13:35

@AmaraMiloudi все еще не работает :)

Octavian Niculescu 23.04.2022 13:40

Вы устанавливаете Node только на этапе base, но ваши этапы build и publish начинаются с образа .NET SDK без этой установки.

David Maze 23.04.2022 13:55

@DavidMaze, вот и все. Я новичок в Docker, поэтому не знал, как это работает. Пожалуйста, добавьте свой комментарий в качестве ответа, я приму его как можно скорее.

Octavian Niculescu 23.04.2022 14:04
3 метода стилизации элементов HTML
3 метода стилизации элементов HTML
Когда дело доходит до применения какого-либо стиля к нашему HTML, существует три подхода: встроенный, внутренний и внешний. Предпочтительным обычно...
Формы c голосовым вводом в React с помощью Speechly
Формы c голосовым вводом в React с помощью Speechly
Пытались ли вы когда-нибудь заполнить веб-форму в области электронной коммерции, которая требует много кликов и выбора? Вас попросят заполнить дату,...
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Стилизация и валидация html-формы без использования JavaScript (только HTML/CSS)
Будучи разработчиком веб-приложений, легко впасть в заблуждение, считая, что приложение без JavaScript не имеет права на жизнь. Нам становится удобно...
Flatpickr: простой модуль календаря для вашего приложения на React
Flatpickr: простой модуль календаря для вашего приложения на React
Если вы ищете пакет для быстрой интеграции календаря с выбором даты в ваше приложения, то библиотека Flatpickr отлично справится с этой задачей....
В чем разница между Promise и Observable?
В чем разница между Promise и Observable?
Разберитесь в этом вопросе, и вы значительно повысите уровень своей компетенции.
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Что такое cURL в PHP? Встроенные функции и пример GET запроса
Клиент для URL-адресов, cURL, позволяет взаимодействовать с множеством различных серверов по множеству различных протоколов с синтаксисом URL.
1
4
39
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Каждый из этапов сборки 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, вам нужен 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

Другие вопросы по теме