我在使用来自 docker 容器的 URL 查看网页内容(swagger 文档)时遇到一些问题。
我尝试了这些 docker-compose 命令:
> docker-compose build
> docker-compose up -d
但是,我无法查看该网页(或大摇大摆 - 因为它是一个 API)。
当我通过单击“运行”按钮从
Docker-Compose
运行 Visual studio
时,它可以工作,并且我能够访问 swagger
文档。但是,当我停止 VS 时,我无法通过导航到提供的 URLS 来访问它。我该如何解决这个问题?
- Solution
- My.Web
- Dockerfile
- My.Lib
- Solution.sln
- docker-compose.yml
- docker-compose.dcproj
- docker-compose.override.yml
我的文件夹结构如下所示:
我的Docker-Compose.yml如下所示:
version: '3.4'
services:
my.web:
container_name: my-9
environment:
- ASPNETCORE_ENVIRONMENT:STAGING
- ASPNETCORE_URLS=https://+:443;http://+:80
ports:
- "8080:80"
- "443:443"
volumes:
- ${APPDATA}/Microsoft/UserSecrets:C:\Users\ContainerUser\AppData\Roaming\Microsoft\UserSecrets:ro
- ${APPDATA}/ASP.NET/Https:C:\Users\ContainerUser\AppData\Roaming\ASP.NET\Https:ro
build:
context: .
dockerfile: My.Web\Dockerfile
My Dockerfile 如下所示:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base
WORKDIR /app
ENV ASPNETCORE_URLS http://*:80
ENV ASPNETCORE_ENVIRONMENT=Development
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["My.Web/My.Web.csproj", "My.Web/"]
COPY ["My.Lib/My.Lib.csproj", "My.Lib/"]
RUN dotnet restore "My.Web/My.Web.csproj"
COPY . .
WORKDIR "/src/My.Web"
RUN dotnet build "My.Web.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "My.Web.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "My.Web.dll"]
如果您使用 webapi 模板作为您应用程序的起点,那么您的 Program.cs 文件中会有一些类似的代码
// Configure the HTTP request pipeline.
if (app.Environment.IsDevelopment())
{
app.UseSwagger();
app.UseSwaggerUI();
}
这使得 Swagger 只有在您的应用程序在开发环境中运行时才可用。默认情况下,容器不被视为开发。
您已在 docker-compose 文件中将
ASPNETCORE_ENVIRONMENT
设置为 STAGING
。 Development
需要是 app.Environment.IsDevelopment()
才能返回 true.
如果你想保持你的环境如
STAGING
,你需要改变Program.cs,这样Swagger就可用了。通过让它测试 STAGING
或完全删除 if 语句。
如果删除 if 语句,这将使 Swagger 始终可用,并且可能被某些人视为安全风险。