Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

"Docker build path not found" in docker support Visual Studio Project

I have C# solution, with 4 projects, 3 being Dlls and 1 is the console application uses those DLLs.

I tried to use docker support on visual studio to build my docker image, it fails My dockerfile as below:

> FROM microsoft/windowsservercore:ltsc2016 
> EXPOSE 80 
> EXPOSE 1433 
> EXPOSE 29051
> 
> COPY bin/x64/debug /root/ ENTRYPOINT
> /root/RmsMainConsole.exe

I CD into directory where my dockerfile is at and execute docker build. Error:

Docker CLI command : docker build -t rmsmainconsole:self-hosted .

Sending build context to Docker daemon  55.61MB
Step 1/6 : FROM microsoft/windowsservercore:ltsc2016
 ---> 9dbf7f740334
Step 2/6 : EXPOSE 80
 ---> Using cache
 ---> ad0ad85fd107
Step 3/6 : EXPOSE 1433
 ---> Using cache
 ---> 81ba13dbd4d4
Step 4/6 : EXPOSE 29051
 ---> Using cache
 ---> 1fa3db800abf
Step 5/6 : COPY bin/x64/debug /root/
COPY failed: CreateFile \\?\C:\ProgramData\Docker\tmp\docker-builder043346063\bin\x64\debug: The system cannot find the path specified.

You can see that PATH couldn't be found. Whereas i tried to create docker file on my .sln level. I changed one line in my docker file.

COPY RmsMainConsole/bin/x64/debug /root/

Note: "RmsMainConsole" directory has been added.

i executed the docker build at my .sln level and i built it successfully. Logs are:

Sending build context to Docker daemon   1.15GB
Step 1/6 : FROM microsoft/windowsservercore:ltsc2016
 ---> 9dbf7f740334
Step 2/6 : EXPOSE 80
 ---> Running in fe97cf236d5a
Removing intermediate container fe97cf236d5a
 ---> c31e236353b6
Step 3/6 : EXPOSE 1433
 ---> Running in f031fce5ecba
Removing intermediate container f031fce5ecba
 ---> 96c704c68ffb
Step 4/6 : EXPOSE 29051
 ---> Running in 365e2be43d0e
Removing intermediate container 365e2be43d0e
 ---> d30c3fb2214b
Step 5/6 : COPY RmsMainConsole/bin/x64/debug /root/
 ---> b214c1edc256
Step 6/6 : ENTRYPOINT /root/RmsMainConsole.exe
 ---> Running in 5c819915532a
Removing intermediate container 5c819915532a
 ---> 247f01bb9b82
Successfully built 247f01bb9b82
Successfully tagged rmsmainconsole:self-hosted

I noticed two difference between the successful and failed build: 1. Size on the docker context 2. The logs at step 5/6:

COPY failed: CreateFile \?\C:\ProgramData\Docker\tmp\docker-builder043346063\bin\x64\debug: The system cannot find the path specified.

and

---> b214c1edc256

How should i use visual studio docker support to build my docker image. Where did i go wrong ?

like image 469
csamleong Avatar asked Jun 20 '18 13:06

csamleong


People also ask

How do I add Docker support to an existing project in Visual Studio?

Existing app Open the project in Visual Studio, and choose one of the following options: Select Docker Support from the Project menu. Right-click the project in Solution Explorer and select Add > Docker Support.

What is Docker build path?

The path must be to a file within the build context. If a relative path is specified then it is interpreted as relative to the root of the context. In most cases, it's best to put each Dockerfile in an empty directory. Then, add to that directory only the files needed for building the Dockerfile.

Where is Docker file path?

Traditionally, the Dockerfile is called Dockerfile and located in the root of the context. You use the -f flag with docker build to point to a Dockerfile anywhere in your file system. $ docker build -f /path/to/a/Dockerfile .

How do I Dockerize in Visual Studio?

Docker support in Visual Studio In ASP.NET Core projects, you can just add a Dockerfile file to the project by enabling Docker support. The next level is container orchestration support, which adds a Dockerfile to the project (if it doesn't already exist) and a docker-compose. yml file at the solution level.


2 Answers

Not sure, whether I answer your question - first or second :).

I was also wondering how Visual Studio is using Docker, because Dockerfile is created within project folder, but it contains paths for COPY like it was in the root (sln) folder.

I played with it a bit and answer is pretty simple.

Visual Studio builds images from the solution folder using -f switch to point to Dockerfile. You can watch Output window to see it running following command:

docker build -f "<path to Dockerfile>" -t <name:tag> --target base  --label "com.microsoft.created-by=visual-studio" "<solution dir>"

So, I would recommend having Dockerfile in project folder and run it from the root folder using -f option like Visual Studio does it.

Does it answer your question(s)?

like image 196
Waldemar Mękal Avatar answered Sep 22 '22 22:09

Waldemar Mękal


I think the actual reason for this is much simpler. If you look at the docker ignore (.dockerignore) file, you'll notice that it ignores everything except for a couple of obj folders. Try removing the * at the top of the docker ignore file to test this out. Then you can selectively ignore things you have in the project folder that you'd like to copy over. I ran into this as well and it took lots of trial and error before I thought to look at the ignore file.

like image 37
GetFuzzy Avatar answered Sep 23 '22 22:09

GetFuzzy