Создание веб-хостинга занимает много времени в Dockerized Spa Application - PullRequest
1 голос
/ 05 апреля 2019

В моем docker-compose запущено несколько приложений.Большинство из них являются простыми приложениями API, но у меня также есть одно веб-приложение SPA (Angular).По некоторым причинам это приложение занимает очень много времени для запуска.Я посмотрел немного ближе и обнаружил, что это WebHostBuilder.Build (), который занимает много времени.Я добавил приведенный ниже код в каждый файл Program.cs, чтобы сравнивать время с другими проектами.

public static void Main(string[] args)
{
    Console.WriteLine("Gateway building");
    var sw = new Stopwatch();
    sw.Start();
    var build = CreateWebHostBuilder(args).Build();
    sw.Stop();
    Console.WriteLine("Gateway running: " + sw.ElapsedMilliseconds);
    build.Run();
}

Вот вывод, полученный после запуска докера, составить

Identityapi building
Блог api building
Здание веб-приложения
Здание шлюза
Идентификатор API работает: 19245
Работает API-интерфейс блога: 28822
Работает шлюз: 25977
Работает веб-приложение: 105640

Как видите, веб-приложение работает в 4-5 раз медленнее, чем все остальные.Запуск из моего веб-приложения все еще довольно прост.Я ничего не делаю, кроме инициализации SpaStaticFiles:

public void ConfigureServices(IServiceCollection services)
{
    services.AddSpaStaticFiles(configuration => configuration.RootPath = "ClientApp/dist");
}

public void Configure(IApplicationBuilder app, IHostingEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseStaticFiles();
    app.UseSpaStaticFiles();

    app.UseSpa(spa => spa.Options.SourcePath = "ClientApp");
}

Мой dockerfile также очень похож на другие dockerfiles:

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

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src

FROM node:10.15 as node-build
WORKDIR /web
COPY /ClientApp .
RUN npm install
RUN npm run build:prod

FROM build as publish
WORKDIR /src
COPY . .
COPY --from=node-build /ClientApp/dist ./ClientApp/dist
RUN dotnet publish arnvanhoutte.Client.csproj -c Release -o /app

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

Выше приведен dockerfile моего веб-приложения, нижеdockerfile файла API

FROM microsoft/dotnet:2.2-aspnetcore-runtime AS base
WORKDIR /identity
EXPOSE 80

FROM microsoft/dotnet:2.2-sdk AS build
WORKDIR /src
COPY arnvanhoutte.Identity/arnvanhoutte.Identity.csproj arnvanhoutte.Identity/
RUN dotnet restore arnvanhoutte.Identity/arnvanhoutte.Identity.csproj
COPY . .
WORKDIR /src/arnvanhoutte.Identity
RUN dotnet build arnvanhoutte.Identity.csproj -c Release -o /identity

FROM build AS publish
RUN dotnet publish arnvanhoutte.Identity.csproj -c Release -o /identity

FROM base AS final
WORKDIR /identity
COPY --from=publish /identity .
ENTRYPOINT ["dotnet", "arnvanhoutte.Identity.dll"]

И файл docker-compose, и файл переопределения довольно просты, я полагаю

version: '3.4'

services:
  gateway:
    image: ${REGISTRY:-arnvanhoutte}gateway:${PLATFORM:-linux}-${TAG:-latest}
    build:
      context: ./arnvanhoutte.Gateway
      dockerfile: Dockerfile
    depends_on:
      - web
      - blog
      - identity
  web:
    image: ${REGISTRY:-arnvanhoutte}web:${PLATFORM:-linux}-${TAG:-latest}
    build:
      context: ./arnvanhoutte.Client
      dockerfile: Dockerfile
    depends_on:
      - blog
      - identity
  blog:
    image: ${REGISTRY:-arnvanhoutte}blog:${PLATFORM:-linux}-${TAG:-latest}
    build:
      context: ./arnvanhoutte.Blog
      dockerfile: Dockerfile
    depends_on:
      - identity
  identity:
    image: ${REGISTRY:-arnvanhoutte}identity:${PLATFORM:-linux}-${TAG:-latest}
    build:
      context: ./arnvanhoutte.Identity
      dockerfile: Dockerfile

Переопределение Docker:

version: '3.4'

services:
  gateway:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
      - ASPNETCORE_URLS=https://+:443;http://+:80
      - ASPNETCORE_HTTPS_PORT=44385
    ports:
      - "7100:80"
      - "44385:443"
    volumes:
      - ${APPDATA}/ASP.NET/Https:/root/.aspnet/https:ro
      - ${APPDATA}/Microsoft/UserSecrets:/root/.microsoft/usersecrets:ro
  web:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "7101:80"
  blog:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "7102:80"
  identity:
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
      - "7103:80"

Iискренне не понимаю, почему это так долго.Если я запускаю его в обычном режиме, а не в докере, он собирается довольно быстро (чуть более 1 секунды), поэтому я думаю, что-то должно быть не так с моим докером-контейнером

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...