【问题标题】:Setting Relative Paths to .xml files with Dockerfile (Visual Studio)使用 Dockerfile (Visual Studio) 设置 .xml 文件的相对路径
【发布时间】:2020-11-16 17:19:18
【问题描述】:

我有一个 Visual Studio 解决方案,其中包含许多 API 项目,然后这些 API 项目中包含 C# 库依赖项。我已经成功地“码头化”了我的解决方案。

出现的一个问题是我的一个 C# 库中包含在启动时读取的 xml 文件。当我独立运行这些库时,路径是 C# 构建的路径,即:

Debug: C:\development\gems\Backend1\DataAPI\bin\Debug\netcoreapp3.1
Release: C:\development\gems\Backend1\DataAPI\bin\Release\netcoreapp3.1

XML 文件被添加到上面的 Debug 和 Release 路径中,它们在 Visual Studio 的非 Dockerized 环境中可以正常读取。

但是对于 Docker 映像,路径现在是“应用程序”。并且这些文件不在“应用程序”的基础级别。他们在:

app/bin/Debug/netcoreapp3.1 和 app/bin/Release/netcoreapp3.1。

我不想将这些文件重新复制到“应用程序”的外部级别,而是有一个可以引用并在 Dockerfile 中设置的相对路径集。这可能吗?

你会提出什么解决方案?

谢谢!

FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["DataAPI/DataAPI.csproj", "DataAPI/"]
COPY ["IdentityServer/IdentityServer.csproj", "IdentityServer/"]
COPY ["ServiceDiscovery/ServiceDiscovery.csproj", "ServiceDiscovery/"]
COPY ["Data/Data.csproj", "Data/"]
COPY ["Utilities/Utilities.csproj", "Utilities/"]
COPY ["UnitConversion/UnitConversion.csproj", "UnitConversion/"]

# Trying (but failing) to copy from my /src/UnitConversion/OverrideDataNames.xml to /app
COPY ["UnitConversion/OverrideDataNames.xml", "/app"]

RUN dotnet restore "DataAPI/DataAPI.csproj"
COPY . .
WORKDIR "/src/DataAPI"
RUN dotnet build "DataAPI.csproj" -c Release -o /app/build

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

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

【问题讨论】:

  • 不知道我是否在回答您的问题,但是当您构建映像时,您可以将文件发布到您希望的任何文件夹RUN dotnet publish -c Release -o /app
  • @Jane:感谢您的回复。我更新了上面的问题以包含 VS-2019 生成的 Dockerfile。我只是想将一个 xml 文件 (OverrideDataNames.xml) 复制到应用程序的顶层。请查看现在添加的代码。那条线不工作。有什么建议么?我究竟做错了什么。谢谢!!

标签: c# visual-studio docker dockerfile


【解决方案1】:

复制覆盖数据名称语法看起来不错。本地文件不能存在。

在 Docker 中做了很多事情,为什么要复制 csproj 文件?无论如何。似乎您可以通过不那么混乱的 dockerfile 更好地了解正在发生的事情。

考虑试试这个

FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
RUN mkdir /app
WORKDIR /app
COPY . /app
RUN dotnet publish ./DataApi -c Release -o /app/build


FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim
WORKDIR /app
COPY --from=build /app/build /app
COPY ./UnitConversion/OverrideDataNames.xml /app
EXPOSE 80
ENTRYPOINT ["dotnet", "DataAPI.dll"]

只需一个构建步骤,COPY . /app 将所有上下文复制到 /app dotnet 然后发布。 dotnet publish 将自行运行恢复。

然后,就像您在文件中所做的那样,使用更精简的运行时映像来放置您的应用程序。在此步骤中,尝试将所需的任何 xml 文件复制到基础 /app。要在图像内移动文件,您宁愿这样做RUN cp dest src

希望上述任何内容对您有所帮助,一旦您完成了一个简单的设置,您就可以对其进行扩展。

【讨论】:

  • 我的 Dockerfile 是在 Visual Studio 2019 中完全创建的,方法是右键单击我的项目并选择:添加-> Docker 支持... .我首先构建我的解决方案,然后从 VS 运行 Docker Compose。它失败并出现以下错误:`错误DT1001服务'dataapi'未能构建:命令'/bin/sh -c dotnet publish ./DataAPI -c Release -o /app/build'返回非零代码:1`我真的很感谢你的帮助。如您所见,我是 Docker 的菜鸟。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2021-04-03
  • 1970-01-01
  • 2010-09-14
  • 2020-05-07
  • 2013-02-02
相关资源
最近更新 更多