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 项目模板?