首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >.Net核心多项目码头建设

.Net核心多项目码头建设
EN

Stack Overflow用户
提问于 2019-12-31 10:08:50
回答 2查看 567关注 0票数 2

我对Docker相当陌生,我正在尝试构建一个多项目Api解决方案dockerfile。

在尝试了大量不同的方法之后,我现在尝试了以下解决方案:

https://stackoverflow.com/a/49728860

这是我的项目布局:

代码语言:javascript
复制
/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内容:

代码语言:javascript
复制
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-project并不依赖于此。

我应该将Dockerfile放在Api-project文件夹中吗?或者当您有依赖项目时,将其保存在解决方案文件夹中是最佳实践吗?

在构建了docker和Docker run -it -p 5000:80 myusername/projectname.api之后,我现在得到了以下确认:

代码语言:javascript
复制
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/swaggerhttp://localhost:5000/swagger时,我没有反应。

EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2020-01-05 11:43:55

虽然我不知道具体原因,但这个问题的解决方案是显式地告诉应用程序在端口80和443运行:

Program.cs:

代码语言:javascript
复制
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上运行的,在没有运气的情况下,我在运行-p 5000:5000参数时使用了这个参数。当我的应用程序在端口80上运行时,它可以工作。在我的停靠设置中,必须有一些东西要求应用程序在端口80或443上运行。

票数 2
EN

Stack Overflow用户

发布于 2020-01-01 03:30:38

关于在项目中放置Dockerfile的位置,文件的确切位置符合您的偏好或团队标准。但是,我怀疑将该文件移到API项目子目录在您的情况下不是一个好主意,因为您当前的Dockerfile需要将整个解决方案包含在您的docker构建上下文中。将构建上下文设置为与Dockerfile不同的目录对于大多数我曾经使用过的Docker用户来说是不正常的。此外,它已经建设成功。

相反,您可以通过为您的最后阶段使用适当的dotnet核心运行时映像来优化您的多阶段构建,因为这个映像比SDK映像小得多。

下面是微软的一个页面,它描述了您会发现有帮助的可用dotnet核心对接器映像:https://learn.microsoft.com/en-us/aspnet/core/host-and-deploy/docker/building-net-docker-images?view=aspnetcore-3.1

关于无法从主机上的浏览器访问在容器中运行的应用程序,我怀疑您的问题与docker run命令中列出的端口绑定顺序不正确有关。试试这个:

代码语言:javascript
复制
docker run -it -p 5000:5000 myusername/projectname.api

然后您应该能够从您的主机访问http://localhost:5000/swagger

作为参考,docker文档指出,端口应该在顺序{host_port}:{container_port}中列出。因此,如果您想将容器中的端口5000绑定到主机上的端口80,正确的命令是:

代码语言:javascript
复制
docker run -it -p 80:5000 myusername/projectname.api

使用该命令,您可以从主机上的端口80访问容器中正在运行的应用程序。

请参阅本页中的标题发布或公开端口https://docs.docker.com/engine/reference/commandline/run/

希望这能有所帮助。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/59542605

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档