Building a Docker image from a multi project dot n

2020-06-10 14:14发布

I am trying to build a docker image from a visual studio solution that consists of two projects:

  • one project contains common code (http methods, logging etc)
  • the other is the business logic and application

I can build and run in Visual Studio, which produces a Docker image that I am able to deploy to our test environment. However, any POSTs sent to the API in the test environment return a 500 error. I can see references like: '/Users/Tim/Documents/Dotnet Code/dotnetcore-app/App/MyClass.cs' in the error response, which leads me to suspect there is something up with the image - that path is on my laptop.

Hoping someone else may have come across something similar, or could provide some pointers about building a multi project solution like this into a Docker container.

Disclaimer: this is my first time working with dotnet core and visual studio - I have some experience with docker.

1条回答
Ridiculous、
2楼-- · 2020-06-10 14:55

If you use "standard" Dockerfile template from Visual Studio, you might have issue with having your "common" project being built on your local PC (probably windows) and the "main" project being built in docker container (probably Linux). the "main" dll is referencing windows-built dll, hence the issues.

Make sure you are copying not only main project, but also the common project, so dotnet can build it in docker also.

Try out this 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"]

Although is to build the "Main" project, it's executed on the sln level.

查看更多
登录 后发表回答