Docker 运行 命令如 Visual Studio

Docker run command like in Visual Studio

当运行使用 ASP.NET Core Web API 由 Visual Studio 2022 创建并启用 docker 选项的项目时,通过浏览器连接到服务器可以通过使用 https://localhost:65215/swagger/index.html (它甚至自己弹出)。

当运行通过指定端口80和443(例如65214和65215)的映射来连接容器时,无法在指定端口上到达Swagger。所以肯定还有更多。

如何使用 docker 运行 命令从控制台 运行 docker 容器?以及如何设置或至少识别端口?

Dockerfile

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApiContainerized/WebApiContainerized.csproj", "WebApiContainerized/"]
RUN dotnet restore "WebApiContainerized/WebApiContainerized.csproj"
COPY . .
WORKDIR "/src/WebApiContainerized"
RUN dotnet build "WebApiContainerized.csproj" -c Release -o /app/build

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

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

Program.cs

var builder = WebApplication.CreateBuilder(args);

// Add services to the container.

builder.Services.AddControllers(); // Learn more about configuring Swagger/OpenAPI at https://aka.ms/aspnetcore/swashbuckle builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen();

var app = builder.Build();

// Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) {
    app.UseSwagger();
    app.UseSwaggerUI(); }

app.UseHttpsRedirection();

app.UseAuthorization();

app.MapControllers();

app.Run();

项目创建

默认情况下,只有当您在 'development' 环境中 运行 您的应用时,Swagger 才可用。

默认情况下,容器化应用 运行 正在生产中。

要更改它,请将 ASPNETCORE_ENVIRONMENT 变量设置为 'Development'。您可以在 docker run 上执行此操作,也可以在 Dockerfile 中进行设置。

至于端口,Microsoft 在 aspnet 图像中将 ASPNETCORE_URLS 设置为 http://+:80,导致应用程序在端口 80 上侦听。

像这样向您的 Dockerfile 添加一行以设置 ASPNETCORE_ENVIRONMENT

FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT Development
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["WebApiContainerized/WebApiContainerized.csproj", "WebApiContainerized/"]
RUN dotnet restore "WebApiContainerized/WebApiContainerized.csproj"
COPY . .
WORKDIR "/src/WebApiContainerized"
RUN dotnet build "WebApiContainerized.csproj" -c Release -o /app/build

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

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

使用

构建并运行
docker build -t myimage .
docker run -d -p 65214:80 myimage

您现在应该可以通过 http://localhost:65214/swagger 访问 Swagger 页面

假设您的代码包含类似这样的内容...

if (app.Environment.IsDevelopment())
{
    app.UseSwagger();
}

... Swagger 仅在由 ASPNETCORE_ENVIRONMENT 环境变量控制的开发环境模式下可用。

最简单的方法是将其设置为 开发 作为 run 命令的一部分:

docker run -p 65215:80 -e ASPNETCORE_ENVIRONMENT=Development yourimage:yourtag