В моем 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 секунды), поэтому я думаю, что-то должно быть не так с моим докером-контейнером