从多项目dot net核心解决方案构建Docker镜像

13

我正在尝试从一个包含两个项目的Visual Studio解决方案构建Docker镜像:

  • 一个项目包含公共代码(如HTTP方法、记录等)
  • 另一个是业务逻辑和应用程序

我可以在Visual Studio中构建和运行,它会生成一个Docker镜像,我可以将其部署到我们的测试环境。然而,发送到测试环境API的任何POST均返回500错误。我可以在错误响应中看到类似这样的引用:'/Users/Tim/Documents/Dotnet Code/dotnetcore-app/App/MyClass.cs',这让我怀疑镜像存在问题 -那条路径位于我的笔记本电脑上。

希望其他人可能也遇到了类似的情况,或者可以提供关于将多项目解决方案构建为Docker容器的一些指导。

免责声明:这是我第一次使用dotnet core和Visual Studio - 我有一些docker的经验。


你能分享一下你的Dockerfiles吗? - Miq
可能是asp.net core 2.0 - 多项目解决方案docker文件的重复问题。 - Rodrigo Werlang
我曾经遇到过这种情况。请检查你引用项目的方式:1)可能你直接通过DLL引用它们,而不是通过标准的ProjectReference引用;2)像主答案中所述的复制语句可能是错误的;3)Docker可能会认为它正在针对Windows进行操作,而实际上并不应该......对我来说,这是由于Docker for Windows安装损坏造成的。 - Kit
1个回答

28

如果您使用Visual Studio中的“标准”Dockerfile模板,则可能会遇到问题,即您在本地PC(可能是Windows)上构建“常规”项目,而在Docker容器(可能是Linux)中构建“主”项目。主要dll引用了由Windows构建的dll,因此会出现问题。

确保不仅复制了主项目,还复制了公共项目,这样dotnet也可以在docker中构建它。

尝试使用此dockerfile:

FROM microsoft/aspnetcore:2.0 AS base
WORKDIR /app
ENV ASPNETCORE_ENVIRONMENT=Production
ENV ASPNETCORE_URLS http://*:5000
EXPOSE 5000

FROM microsoft/aspnetcore-build:2.0 AS builder
ARG Configuration=Release
WORKDIR /src
COPY *.sln ./
COPY Project.Main/Project.Main.csproj Project.Main/
COPY Project.Common/Project.Common.csproj Project.Common/
RUN dotnet restore
COPY . .
WORKDIR /src/ProjectMain
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", "Project.Main.dll"]

尽管是构建"Main"项目,但它是在sln级别上执行的。


3
运行良好,但是如果我的解决方案包含多个Web应用程序怎么办?我该如何为每个Web应用程序获取一个部署? - Daní
@Daní可以为Web项目添加单独的Docker文件,然后分别构建它们吗? - Leszek P
你能解释一下这个COPY命令的每一行都是干什么的,以及为什么dotnet需要在同一个目录下拥有所有这些.csproj文件来进行构建吗?我在我的dotnet命令中遇到了构建错误。 - Arthur Melo

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接