I\'m trying to create a deployment pipeline to deploy my image to Kubernetes cluster. The first step in this process is to create an image based on the docker file. The docker
In my case, I had the following folder structure:
+-- [REPOSITORY FOLDER]
| +-- [SOLUTION FOLDER]
| | +-- [*.SLN]
| | +-- [PROJECT Folder]
| | | +-- [*.CSPROJ]
| | | +-- [dockerfile]
My docker file is inside the project folder.
After modifying to use only the CSPROJ file in the first copy, and receiving the missing MAIN method error, not having a suitable static main entry point, I fixed it replacing the "copy .." to "COPY . [project_name]/"
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["SampleApi1.csproj", "SampleApi1/"]
RUN dotnet restore "SampleApi1/SampleApi1.csproj"
COPY . SampleApi1/
WORKDIR "/src/SampleApi1"
RUN dotnet build "SampleApi1.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "SampleApi1.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "SampleApi1.dll"]
[error]COPY failed: stat/var/lib/docker/tmp/docker-builder158012929/DockerTest/DockerTest.csproj: no such file or directory
According to this error message, the error occurred on the line of your dockerfile: COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
.
First, please confirm that you did not use .dockerignore
file to exclude this file: DockerTest/DockerTest.csproj
, which must exists in the directory where you run your build from.
If it does not ignored by .dockerignore
file, then you need to consider about your dockerfile location level.
DockerTest.csproj
file should not put at the lower source file path level. You need to change the source of the context, move it at a higher level. So modify your dockerfile manually as :
COPY ["DockerTest.csproj", "DockerTest/"]
I solved the issue by setting the buildContext to '$(Build.Repository.LocalPath)' using the same dockerfile as in Visual Studio without adjusting the paths:
In YAML-Konfiguration, I added the following line:
buildContext: '$(Build.Repository.LocalPath)'
For me it worked with following yaml settings
steps:
task: Docker@2
displayName: Build docker
inputs:
command: 'buildAndPush'
Dockerfile: '**/Dockerfile'
buildContext: '$(Build.Repository.LocalPath)'
The dockerfile can stay as Visual Studio generated it.
This problem is arise when you generate the Docker support via Visual Studio (v16.3.9 at least) and you are using this generated project in the Azure Pipeline with the predefined Docker pipeline template either in old-fashioned everything-to-click way so called the classic editor or the new 4-step easy-to-click way so called the modern editor.
The change in the generated file from
COPY ["DockerTest/DockerTest.csproj", "DockerTest/"]
to
COPY ["DockerTest.csproj", "DockerTest/"]
solve the problem with the Azure Pipeline but it will break your local build within the Visual Studio.
Adding
buildContext: '$(Build.Repository.LocalPath)'
to the YAML file which has been generated by the modern editor will break the build task. The template which is used in the modern editor relies on the default build context and the parser will not recognise the buildContext
command.
Only possible way how to fix this problem is to override the default build context. This override will keep the build functionality either in Visual Studio or the Azure Pipeline.
The build context can be overridden in the build image task in the classic editor.