Отказано в подключении за пределами приложения docker container C #

#c# #docker #.net-core #dockerfile

#c# #docker #.net-core #dockerfile

Вопрос:

У меня есть приложение на C #.Net Core (версия 3.1) и когда я его запускаю. Все работает нормально.

Когда я запускаю его в контейнере docker — он хорошо работает в контейнере, но у меня ошибка Connection Refused при попытке вызвать конечную точку вне контейнера

мои команды

 docker build . -t project
docker run project -p 23183:23183
 

моя Program.cs

 using System.IO;
using Microsoft.AspNetCore.Hosting;

namespace project
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = new WebHostBuilder()
                .UseContentRoot(Directory.GetCurrentDirectory())
                .UseKestrel()
                .UseStartup<Startup>()
                .Build();

            host.Run();
        }
    }
}
 

мой Startup.cs

 public Startup(IConfiguration configuration)
{
    Configuration = configuration;
}

public IConfiguration Configuration { get; }

public void ConfigureServices(IServiceCollection services)
{
    services.AddRouting(options => options.LowercaseUrls = true);

    services.AddIdentityServerAuth(Configuration);
    services.AddSwaggerGen(options =>
    {
        options.SwaggerDoc("v1", new OpenApiInfo
        {
            Title = "Project API",
            Version = "v1"
        });
        // Set the comments path for the Swagger JSON and UI.
        string xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml";
        string xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile);
        options.IncludeXmlComments(xmlPath);

        options.OperationFilter<AddAuthorizationHeaderParameterOperationFilter>();
    });
   
    services.AddCors();
    services.AddControllers(options => options.EnableEndpointRouting = false);
}

public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    DbStaticConfig.Init(Configuration.GetConnectionString("ProjectDb"));

    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
    }
    else
    {
        app.UseHsts();
    }

    app.UseSwagger(c =>
    {
        c.PreSerializeFilters.Add((document, request) =>
        {
            var paths = document.Paths.ToDictionary(item => item.Key.ToLowerInvariant(), item => item.Value);
            document.Paths.Clear();
            foreach (var pathItem in paths)
            {
                document.Paths.Add(pathItem.Key, pathItem.Value);
            }
        });
    });

    app.UseSwaggerUI(options =>
    {
        options.SwaggerEndpoint("/swagger/v1/swagger.json", "Project API v1");
        options.RoutePrefix = string.Empty;
        options.ConfigObject.DeepLinking = true;
    });

    app.UseCors(x => x
        .AllowAnyMethod()
        .AllowAnyHeader()
        .SetIsOriginAllowed(origin => true)
        .AllowCredentials());

    app.UseRouting();
    app.UseAuthentication();
    app.UseHttpsRedirection();
    app.UseEndpoints(x => x.MapControllers());
}
 

мой Dockerfile

 FROM mcr.microsoft.com/dotnet/core/sdk:3.1 as base
COPY . /app
WORKDIR /app
EXPOSE 23183/tcp
ENV ASPNETCORE_URLS http://*:23183

# Build
FROM base as build
WORKDIR /src
COPY *.sln ./
COPY project/project.csproj project/

RUN dotnet restore
COPY . .
WORKDIR /src/project

# Publish
FROM build AS publish
RUN dotnet publish -c Release -o /app/out

FROM base AS final
WORKDIR /app
COPY --from=publish /app/out ./
ENTRYPOINT ["dotnet", "project.dll", "--server.urls", "http://0.0.0.0:23183"]
 

Комментарии:

1. Я думаю, вам нужно использовать --urls в качестве аргумента в массиве ENTRYPOINT (Dockerfile). andrewlock.net/5-ways-to-set-the-urls-for-an-aspnetcore-app

2. @stefan Я пытался, но это не работает

3. Позвольте мне прояснить — вы не можете получить доступ к своему API localhost:23183 со своего локального компьютера?

4. @rytisk да, это так.

Ответ №1:

Не уверен, в чем именно заключается ваша проблема, но вот как выглядит мой файл docker. Надеюсь, это поможет:

 FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base

WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["path/to/project.csproj", "project/"]
COPY . .
WORKDIR "/src/project"

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

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

Комментарии:

1. Почему вы не вызываете восстановление dotnet?

2. Вы можете, если хотите, но для меня это делается на этапе сборки

3. Извиняюсь, это фактически сделано на RUN dotnet publish шаге