Visual Studio:当链接文件在项目中时,docker build 失败

Posted

技术标签:

【中文标题】Visual Studio:当链接文件在项目中时,docker build 失败【英文标题】:Visual Studio: docker build fails when linked files are in the project 【发布时间】:2021-11-22 00:53:07 【问题描述】:

我有一个 .NET 6 控制台项目,其中包含 2 个二进制文件作为链接文件:

 <ItemGroup>
    <None Include="..\HFMath\bin\HFMath.dll" Link="HFMath.dll">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
    <None Include="..\HFMath\bin\libHFMath.so" Link="libHFMath.so">
      <CopyToOutputDirectory>PreserveNewest</CopyToOutputDirectory>
    </None>
  </ItemGroup>

我需要将它部署为 docker 容器。 Visual Studio 搭建的 Dockerfile 是

FROM mcr.microsoft.com/dotnet/runtime:6.0 AS base
WORKDIR /app

FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build
WORKDIR /src
COPY ["ConsoleApp1/ConsoleApp1.csproj", "ConsoleApp1/"]
RUN dotnet restore "ConsoleApp1/ConsoleApp1.csproj"
COPY . .
WORKDIR "/src/ConsoleApp1"
RUN dotnet build "ConsoleApp1.csproj" -c Release -o /app/build

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

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

当我运行 docker build 时,我收到以下错误:

#15 1.054   Determining projects to restore...
#15 1.322   All projects are up-to-date for restore.
#15 2.552 /usr/share/dotnet/sdk/6.0.100/Microsoft.Common.CurrentVersion.targets(5100,5): error MSB3030: Could not copy the file "/src/HFMath/bin/libHFMath.so" because it was not found. [/src/ConsoleApp1/ConsoleApp1.csproj]
#15 2.552 /usr/share/dotnet/sdk/6.0.100/Microsoft.Common.CurrentVersion.targets(5100,5): error MSB3030: Could not copy the file "/src/HFMath/bin/HFMath.dll" because it was not found. [/src/ConsoleApp1/ConsoleApp1.csproj]
#15 2.556
#15 2.556 Build FAILED.

我知道 docker 不支持符号链接,但我仍然需要构建映像。 我该如何解决这个问题(不更改 .NET 项目)?

【问题讨论】:

文件是否被复制到容器中并位于错误中指定的路径?错误消息似乎表明它们不是。 @SimplyGed dockerfile 由 Visual Studio 搭建。不是手动创建的。它应该照顾需要的东西 HFMath.dll 是否存储在您的项目的 src 文件夹下,例如src\HFMath\bin\HFMath.dll? Based on the .csproj` 文件和来自 Docker 的错误看起来像是在 src 之外? Docker 正在从src 文件夹中复制文件以构建COPY . .,因此如果文件不在src 文件夹中,则不会被复制。即使 VS 创建了 Dockerfile,也不能保证它会复制所有文件,尤其是当它们在 build context 之外时。 ***.com/questions/27068596/…HTH @SimplyGed 请注意,问题不是“为什么它不起作用”,而是“我该如何解决它”。您能否在不涉及项目的情况下展示一个我可以用来解决此问题的 Dockerfile? 【参考方案1】:

问题

如果您使用 Visual Studio 自动生成了Dockerfile,它还会创建一个.dockerignore 文件(通常在.sln 文件夹中)。该文件将包含一个条目,用于从构建上下文中排除 **/bin

这意味着当COPY . . 执行时,它会忽略任何bin 文件夹中的文件

解决方案

    查找并编辑.dockerignore 文件。 添加行 !HFMath/bin/ - 这将告诉 Docker 不要忽略 HFMath/bin 文件夹 再次运行docker build 命令

【讨论】:

以上是关于Visual Studio:当链接文件在项目中时,docker build 失败的主要内容,如果未能解决你的问题,请参考以下文章

Visual Studio 自定义包含路径在链接时导致符号错误

如何创建包含链接文件的 Visual Studio 项目模板?

Microsoft Visual Studio 2013 链接错误 1104

在 Visual Studio 解决方案中链接两个项目

Visual Studio 中的源文件包含

将Visual Studio 2017中的Assembly和C ++与命令行和输出相结合