Папка node_modules отсутствует после npm установки внутри Docker - PullRequest
1 голос
/ 27 февраля 2020

В последние несколько дней я пытаюсь развернуть приложение asp. net core 3.1 в службе Google Cloud App Engine. Я думаю, что я довольно близко, но на данный момент у меня проблема с установкой npm пакетов. Как правило, я использую папку node_modules в виде stati c файлов в моем приложении страниц Razor, поэтому у меня в классе Startup.cs есть такой фрагмент кода:

app.UseStaticFiles(new StaticFileOptions
{
  FileProvider = new PhysicalFileProvider(Path.Combine(Directory.GetCurrentDirectory(), "node_modules")),
  RequestPath = "/node_modules"
});

Облако Google не поддерживает. net core 3.1 на данный момент, поэтому единственный способ развернуть приложение - это развернуть его как Docker образ. Итак, вот мой Dockerfile:

FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
WORKDIR /source

# copy csproj and restore as distinct layers
COPY myApp/myApp.csproj myApp/
COPY myApp.DataAccess/myApp.DataAccess.csproj myApp.DataAccess/
COPY myApp.Model/myApp.Model.csproj myApp.Model/
RUN dotnet restore myApp/myApp.csproj

# copy and build app and libraries
COPY myApp/ myApp/
COPY myApp.DataAccess/ myApp.DataAccess/
COPY myApp.Model/ myApp.Model/
WORKDIR /source/myApp
RUN dotnet build -c release

FROM build AS publish
RUN dotnet publish -c release --no-build -o /app

# npm libs
FROM node:10
WORKDIR /app
COPY myApp/package.json .
COPY myApp/package-lock.json .
RUN npm install
RUN npm root

# final stage/image
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "myApp.dll"]

Сборка docker успешна, но когда я пытаюсь запустить контейнер, есть такое исключение:

System.IO.DirectoryNotFoundException: /app/node_modules/
   at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root, ExclusionFilters filters)
   at Microsoft.Extensions.FileProviders.PhysicalFileProvider..ctor(String root)
   at UniCableApp.Startup.Configure(IApplicationBuilder app, IWebHostEnvironment env, RoleManager`1 roleManager, UserManager`1 userManager) in /source/UniCableApp/Startup.cs:line 113

Я создал Изображение остановленного контейнера с использованием:

docker commit <id> <snapshot name>

После этого я смог проверить изображение с помощью:

docker run -ti --entrypoint=sh<snapshot name>

И в каталоге / app нет папки node_modules. Как я уже сказал, я новичок в мире Docker, так что, может быть, кто-то может помочь мне с этим вопросом?

1 Ответ

2 голосов
/ 27 февраля 2020

Вы копируете /app из слоя publish image | и фактически игнорируете установку NPM, которую вы выполняете в слое FROM: node.

FROM: node необходимо COPY --from=publish /app . возможно, также назовите этот слой.

И затем слою runtime тоже нужно будет COPY --from=2 /app ., или как вы решите назвать слой node.

Возможно, вам понадобится /app/ ./ (завершение /), чтобы убедиться, что копии рекурсивные.

Я не уверен, стоит ли включать файл package-lock.json. Я думаю, что вы правильно включили его, но, возможно, это исключает установку пакета. Не знаю.

Вы можете подтвердить, что /app/node_modules добавлено и перенесено, добавив следующее к каждому слою, а затем проверив вывод при построении изображений:

RUN ls -ld /app

NB Вычислительные сервисы Google Cloud Platform отлично подходят для среды выполнения Microsoft, включая. NET Core. Мне неясно, что вы имеете в виду, когда он не поддерживается.

Обновление: repro

Я сделал более простое повторение вашего примера, чтобы показать работу:

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

COPY app/app.csproj ./
RUN dotnet restore ./app.csproj

COPY app/ app/
RUN dotnet build

FROM build AS publish
WORKDIR /app

COPY --from=build /app .
RUN ls -l /app

RUN dotnet publish

FROM node:10 as node
WORKDIR /app
COPY --from=publish /app .
RUN ls -l /app

COPY app/package.json .
RUN npm install
RUN npm root

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
WORKDIR /app

COPY --from=node /app .
RUN ls -l /app

ENTRYPOINT ["dotnet", "myApp.dll"]

И:

docker build --tag=60424677 --file=Dockerfile --no-cache .

Выход (отредактировано для ясности):

Sending build context to Docker daemon  6.144kB
Step 1/23 : FROM mcr.microsoft.com/dotnet/core/sdk:3.1 AS build
...
Step 7/23 : FROM build AS publish
Step 9/23 : COPY --from=build /app .
Step 10/23 : RUN ls -l /app
drwxr-xr-x 2 root root 4096 Feb 27 20:50 app
-rw-r--r-- 1 root root  178 Feb 27 20:41 app.csproj
drwxr-xr-x 4 root root 4096 Feb 27 20:50 bin
drwxr-xr-x 4 root root 4096 Feb 27 20:50 obj
...
Step 12/23 : FROM node:10 as node
Step 14/23 : COPY --from=publish /app .
Step 15/23 : RUN ls -l /app
drwxr-xr-x 2 root root 4096 Feb 27 20:50 app
-rw-r--r-- 1 root root  178 Feb 27 20:41 app.csproj
drwxr-xr-x 3 root root 4096 Feb 27 20:51 bin
drwxr-xr-x 3 root root 4096 Feb 27 20:50 obj
...
Step 19/23 : FROM mcr.microsoft.com/dotnet/core/aspnet:3.1 AS runtime
Step 21/23 : COPY --from=node /app .
Step 22/23 : RUN ls -l /app
drwxr-xr-x 2 root root 4096 Feb 27 20:50 app
-rw-r--r-- 1 root root  178 Feb 27 20:41 app.csproj
drwxr-xr-x 3 root root 4096 Feb 27 20:51 bin
drwxr-xr-x 3 root root 4096 Feb 27 20:51 node_modules
drwxr-xr-x 3 root root 4096 Feb 27 20:50 obj
-rw-r--r-- 1 root root  345 Feb 27 20:51 package-lock.json
-rw-r--r-- 1 root root  270 Feb 27 20:51 package.json
...
Successfully built 43ba6f8577e5
Successfully tagged 60424677:latest
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...