docker 支持 Visual Studio 项目中的“未找到 Docker 构建路径”

csa*_*ong 7 visual-studio docker docker-image windows-container

我有 C# 解决方案,有 4 个项目,3 个是 Dll,1 个是控制台应用程序使用这些 DLL。

我试图在 Visual Studio 上使用 docker 支持来构建我的 docker 镜像,它失败了我的 dockerfile 如下:

> FROM microsoft/windowsservercore:ltsc2016 
> EXPOSE 80 
> EXPOSE 1433 
> EXPOSE 29051
> 
> COPY bin/x64/debug /root/ ENTRYPOINT
> /root/RmsMainConsole.exe
Run Code Online (Sandbox Code Playgroud)

我 CD 到我的 dockerfile 所在的目录并执行 docker build。错误:

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.
Run Code Online (Sandbox Code Playgroud)

您可以看到找不到 PATH。而我试图在我的 .sln 级别创建 docker 文件。我在 docker 文件中更改了一行。

复制 RmsMainConsole/bin/x64/debug /root/

注意:已添加“RmsMainConsole”目录。

我在我的 .sln 级别执行了 docker build,我成功地构建了它。日志是:

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
Run Code Online (Sandbox Code Playgroud)

我注意到成功构建和失败构建之间的两个区别:1. docker 上下文的大小 2. 步骤 5/6 中的日志:

COPY failed: CreateFile \?\C:\ProgramData\Docker\tmp\docker-builder043346063\bin\x64\debug: 系统找不到指定的路径。

---> b214c1edc256

我应该如何使用 Visual Studio docker 支持来构建我的 docker 镜像。我哪里做错了 ?

小智 5

不确定,我是回答你的问题 - 首先还是第二个:)。

我还想知道 Visual Studio 是如何使用 Docker 的,因为 Dockerfile 是在项目文件夹中创建的,但它包含 COPY 的路径,就像它在根 (sln) 文件夹中一样。

我玩了一下,答案很简单。

Visual Studio 使用-fswitch从解决方案文件夹构建图像以指向 Dockerfile。您可以观察Output窗口以查看它运行以下命令:

docker build -f "<path to Dockerfile>" -t <name:tag> --target base  --label "com.microsoft.created-by=visual-studio" "<solution dir>"
Run Code Online (Sandbox Code Playgroud)

因此,我建议将 Dockerfile 放在项目文件夹中,并使用-fVisual Studio 之类的选项从根文件夹运行它。

它是否回答了您的问题?


csa*_*ong 4

经过一番思考、尝试和错误,问题并不在于docker支持visual studio。Docker build 必须在我的解决方案目录的根目录下运行,因为 docker build 需要能够找到映像文件所依赖的所有依赖项。

但让我好奇的是,那么 docker 对 Visual Studio 的支持是如何发挥作用的呢?我只能在我的控制台应用程序项目中右键单击 -> 添加 Docker 支持。

我当前的解决方案是在解决方案的根目录中手动添加一个 docker 文件。如果有人知道 Visual Studio docker 支持有更好的方法来解决这个问题,我会很高兴?

谢谢