Van Darth Vadden
Van Darth Vadden

Reputation: 761

Getting "Program does not contain a static 'Main' method suitable for an entry point" when building using docker, why?

I'm running into an issue using Docker and couldn't find a proper solution.

I'm trying to build a Docker image using .NET SDK 2.1.

The thing is that when Docker tries to run the build statement, it fails and the error output is

CSC : error CS5001: Program does not contain a static 'Main' method suitable for an entry point

The funny thing is that if I perform the build statement on command line locally, it works fine.

I have already checked my LanguageVersion tag on the project and it is 7.3.

Here is my Docker file

FROM microsoft/dotnet:2.1-sdk AS builder  
WORKDIR /src
COPY ./nuget  ./nuget
COPY ./NuGet.Config ./
COPY Services/AadTracking ./

# Copy all the referenced projects

COPY ./Services/AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj ./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj
COPY ./Services/AadTracking/Office.Re.Service.AadTracking/Office.Re.Service.AadTracking.csproj ./AadTracking/Office.Re.Service.AadTracking/Office.Re.Service.AadTracking.csproj
COPY ./Services/AadTracking/Company/Office.Re.Service.AadTracking.Company/Office.Re.Service.AadTracking.Company.csproj ./AadTracking/Company/Office.Re.Service.AadTracking.Company/Office.Re.Service.AadTracking.Company.csproj
COPY ./Services/AadTracking/Office.Re.Service.AadTracking.EventStore/Office.Re.Service.AadTracking.EventStore.csproj ./AadTracking/Office.Re.Service.AadTracking.EventStore/Office.Re.Service.AadTracking.EventStore.csproj

# Restore packages
RUN dotnet restore "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj"

RUN dotnet build -c Debug --no-restore "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj"

# COPY source code 
#aad tracking
COPY ./Services/AadTracking/Company/Company.Service.AadTracking ./AadTracking/Company/Company.Service.AadTracking/
COPY ./Services/AadTracking/Office.Re.Service.AadTracking ./AadTracking/Office.Re.Service.AadTracking/
COPY ./Services/AadTracking/Company/Office.Re.Service.AadTracking.Company ./AadTracking/Company/Office.Re.Service.AadTracking.Company/
COPY ./Services/AadTracking/Office.Re.Service.AadTracking.EventStore ./AadTracking/Office.Re.Service.AadTracking.EventStore/

# Publish
RUN dotnet publish "./AadTracking/Company/Company.Service.AadTracking/Company.Service.AadTracking.csproj" -c Debug -o "../../dist"

# #Build the app image
FROM microsoft/dotnet:2.1-aspnetcore-runtime  
WORKDIR /app  

ENV ASPNETCORE_ENVIRONMENT Switch
ENV REINSURANCE_INSTANCE Docker-dev 

COPY --from=builder /dist .  

ENTRYPOINT ["dotnet", "Company.Service.AadTracking.dll"]

Upvotes: 71

Views: 67066

Answers (13)

Youssef Bennour Sahli
Youssef Bennour Sahli

Reputation: 65

In my case I had the 'src' folder next to the '.sln' solution file, and that 'src' folder contained all my projects.
This is the corrupted DockerFile :

WORKDIR /src
COPY ["src/Starter/Starter.csproj", "Starter/"]
RUN dotnet restore "Starter/Starter.csproj"
COPY . .
WORKDIR "/src/Starter"
RUN dotnet build "Starter.csproj" -c Release -o /app/build

I just turned this part :

COPY . .

Into this and it worked fine :

COPY /src .

Upvotes: 2

Omer
Omer

Reputation: 10244

2023 Update

Unfortunately, there is an inconsistency in what Microsoft includes in Dockerfile and in which directory you run it.

There are three solutions to get this work.

First Solution

  1. Put your auto-generated Dockerfile one level up, alongside the .sln file.

  2. From the root directory of the solution, run the below command

    docker build -t imagename .


Second Solution

  1. Leave the Dockerfile as it is, inside your project folder.

  2. From the root directory of the solution, run the below command

    docker build -t imagename -f .\SampleProject\Dockerfile .


Third Solution

Make small changes to the Dockerfile. Now you have to run docker commands not from the root directory of the solution, but from your project folder. (one level down from .sln file).

Change from below enter image description here

to enter image description here

Supplementary

enter image description here

Upvotes: 71

JoeB
JoeB

Reputation: 11

This error means that the file containing the Main method is NOT included so you either forgot to copy it over to the proper directory or docker is point to the incorrect directory.

Upvotes: 1

Abdus Salam Azad
Abdus Salam Azad

Reputation: 5492

For me the COPY.. was after the workdir before the dotnet build command. I just put it after the workdir command. Then it was working.

WORKDIR "/src/WeatherAPI"
COPY . .
RUN dotnet build "WeatherAPI.csproj" -c Release -o /app/build

Upvotes: 5

arakakivl
arakakivl

Reputation: 347

Using a multi-project solution structure, I fixed by adding "src" again into the directory to build.

Something like this:

COPY ["src/Todo.Core/Todo.Core.csproj", "Todo.Core/"]
RUN dotnet restore "Todo.Api/Todo.Api.csproj"
COPY . .
WORKDIR "/src/Todo.Api/"
RUN dotnet build "Todo.Api.csproj" -c Release -o /app/build

Turned into this:

COPY ["src/Todo.Core/Todo.Core.csproj", "Todo.Core/"]
RUN dotnet restore "Todo.Api/Todo.Api.csproj"
COPY . .
WORKDIR "/src/src/Todo.Api/"
RUN dotnet build "Todo.Api.csproj" -c Release -o /app/build

Upvotes: 17

marvelTracker
marvelTracker

Reputation: 4969

I know this is little bit late to answer. Still VS 2019 has the same issue with .NET Core 3.1. I took a peek at the examples provided by Microsoft. Turns out the Docker file resided in a different place in the solution and Docker copy command wasn't working properly.

You have to move your docker file one directory up, so that they are at the same level as the sln file. It will fix the issue.

OR else you can change the paths like below sample docker file WITHOUT changing the docker file location, IMHO it is better to keep the docker file with other files.

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim-arm64v8 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["WhatzThat.Web.csproj", "WhatzThat.Web/"]
RUN dotnet restore "WhatzThat.Web/WhatzThat.Web.csproj" -r linux-arm64

WORKDIR "/src/WhatzThat.Web"
COPY . .

RUN dotnet build "WhatzThat.Web.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "WhatzThat.Web.csproj" -c Release -o /app/publish -r linux-arm64 --self-contained false --no-restore

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "WhatzThat.Web.dll"]

Upvotes: 115

AleM
AleM

Reputation: 297

My DockerFile is at root level not upper and I changed the DockerFile to:

#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.

#Depending on the operating system of the host machines(s) that will build or run the containers, the image specified in the FROM statement may need to be changed.
#For more information, please see https://aka.ms/containercompat

FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
WORKDIR /src
COPY ["projectName.csproj", "projectName/"]
RUN dotnet restore "projectName/projectName.csproj"

WORKDIR "/src/projectName"
COPY . .
RUN dotnet build "projectName.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "projectName.csproj" -c Release -o /app/publish

FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "projectName.dll"]

Upvotes: 3

Seth
Seth

Reputation: 61

Answer by marvelTracker worked for me but busted using the built in Docker tools in Visual Studio 2022.

Using the command docker build -f Dockerfile .. while in the project folder builds the dockerfile from the perspective of the parent folder.

Microsoft Doc that explains building Docker in VS2022: https://learn.microsoft.com/en-us/visualstudio/containers/container-build?view=vs-2022

NOTE: I found this troubleshooting the same error for a .NET 6 Docker project.

Hopefully this helps someone else.

Upvotes: 2

Jend DimShu
Jend DimShu

Reputation: 97

I got same issue and manage to identify the root cause.

The issue occurred because I run the application on my windows machine before I build the docker Linux image.

Because I run it on my local windows it generate obj folder on the source code, the obj folder got copied to Docker container which contain windows specific assembly version IMHO.

To fix the issue I simply delete the obj folder from my project and rebuild the Docker.

Lesson learned, do build your Docker images on a freshly cloned repository.

Upvotes: 0

satyarc
satyarc

Reputation: 21

From the folder having Dockerfile at present,

execute

mv Dockerfile ../

then invoke

docker build

Upvotes: 1

granadaCoder
granadaCoder

Reputation: 27904

I have a faux pas reason.

My docker file.......I was correctly copying the directory structure and the .sln and .csproj files...........

But I had a syntax error copying the SOURCE files. (.cs files, etc, etc)

#doh!

If you look at the question above, basically I had a syntax-error/bug in the steps right below where the OP has this:

# COPY source code

More importantly, how did I figure this out ??? Here ya go:

docker images

and you do not want to drill into the last one (which is your failing image), but the NEXT TO LAST image. (remembering that docker keeps making new images for the steps of the docker file)

docker images

REPOSITORY           TAG                 IMAGE ID            CREATED             SIZE
mything1/mything2    latest              aaaaaaaaaaaa        27 minutes ago      271MB
<none>               <none>              bbbbbbbbbbbb        27 minutes ago      1.18GB

and then drill into (the next to last one)

docker run --rm -it bbbbbbbbbbbb  sh  

when you get in there, start using "ls" and "cd" commands.

I found out I didn't have my .cs source files in the right place. A few fixes addressing relative-path issues (in my specific case) later......I had my source files in the right place(s). #yay

This is a great in-general tip for when trying to debug a failing non running image.

Upvotes: 2

CSharp
CSharp

Reputation: 1583

I had the same issue.
I've realized that I had my Docker file at the same level of my .csproj file. I've moved my Docker file one level up in my folder structure and it's building fine.

Upvotes: 22

RakeshPawar
RakeshPawar

Reputation: 155

Compiling and publishing an application inside docker will need entire application to be copied inside docker. which means you need to copy all class files(.cs) along with required supporting files(maybe resx or config files) inside docker.

please find below reference for same

https://github.com/aspnet/aspnet-docker/issues/401

Upvotes: 13

Related Questions