c# - .Net Core 多项目 docker 构建

标签 c# docker asp.net-core dockerfile

我对 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/

相关文章:

asp.net-core - 通过托管 IdentityServer 的单独微服务使用 OATH 保护 WebApi 的集成测试

c# - FormsAuthentication 登录在设置授权票证后拒绝重定向

c# - 扩展方法与助手类

c# - 处理订阅事件的类

git - Docker是否替代了git源代码控制?

node.js - 如何在node js中获取docker的环境变量?

go-dockerclient `UploadToContainer` tar 示例

c# - 如何将 XML 数据加载到数据结构中?

c# - ASP.NET Core 模型绑定(bind)和整数

c# - 比较类型是否可为空