#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-app2. @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
шаге