我对 Docker 相当陌生,我正在尝试构建一个多项目 Api 解决方案 dockerfile。
在尝试了大量不同的方法之后,我现在尝试了这个解决方案:
https://stackoverflow.com/a/49728860
这是我的项目布局:
/MainFolder
---Dockerfile
--- Projectname.sln
/Projectname.Api
--- Projectname.Api.csproj
--- code files
/Projectname.Models (api project has dependency of this project)
--- Projectname.Models.csproj
--- code files
/Projectname.Services (api project has dependency of this project)
--- Projectname.Services.csproj
--- code files
这是当前的 Dockerfile 内容:
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS base
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS http://*:5000
EXPOSE 5000
FROM mcr.microsoft.com/dotnet/core/sdk:3.0 AS builder
ARG Configuration=Release
WORKDIR /src
COPY *.sln ./
COPY Projectname.Api/Projectname.Api.csproj Projectname.Api/
COPY Projectname.Models/Projectname.Models.csproj Projectname.Models/
COPY Projectname.Services/Projectname.Services.csproj Projectname.Services/
RUN dotnet restore
COPY . .
WORKDIR /src/Projectname.Api
RUN dotnet build -c $Configuration -o /app
FROM builder AS publish
ARG Configuration=Release
RUN dotnet publish -c $Configuration -o /app
FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "Projectname.Api.dll"]
请注意,该解决方案还包含其他项目,API 项目不依赖于这些项目。
我应该将 Dockerfile 放在 Api 项目文件夹中吗? 或者当您有依赖项目时,最好将其保留在解决方案文件夹中?
在 docker build 和 Docker run -it -p 5000:80 myusername/projectname.api
之后,我现在得到此确认:
warn: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to bind to http://localhost:5000 on the IPv6 loopback interface: 'Cannot assign requested address'.
warn: Microsoft.AspNetCore.Server.Kestrel[0]
Unable to bind to https://localhost:5001 on the IPv6 loopback interface: 'Cannot assign requested address'.
info: Microsoft.Hosting.Lifetime[0]
Now listening on: http://localhost:5000
info: Microsoft.Hosting.Lifetime[0]
Now listening on: https://localhost:5001
info: Microsoft.Hosting.Lifetime[0]
Application started. Press Ctrl+C to shut down.
info: Microsoft.Hosting.Lifetime[0]
Hosting environment: Production
info: Microsoft.Hosting.Lifetime[0]
Content root path: /app
但是当我浏览https://localhost/swagger时或http://localhost:5000/swagger ,我没有任何反应。
最佳答案
虽然我不知 Prop 体原因,但解决此问题的方法是明确告诉应用程序在端口 80 和 443 上运行:
Program.cs:
public static IHostBuilder CreateHostBuilder(string[] args) =>
Host.CreateDefaultBuilder(args)
.ConfigureWebHostDefaults(webBuilder =>
{
webBuilder.UseStartup<Startup>();
webBuilder.UseUrls("http://*:80", "http://*:443");
});
然后运行docker run -it -p 80:80 -p 443:443 myusername/projectname.api
我不明白的是,如果没有这个,我的应用程序似乎在端口 5000 上运行,并且我在运行 docker 时使用了 -p 5000:5000 参数,但没有运气。 当我的应用程序在端口 80 上运行时,它可以工作。 在我的 docker 设置中的某个位置,必须有一些东西要求应用程序在端口 80 或 443 上运行。
关于c# - .Net Core 多项目 docker 构建,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59542605/