我有一个Visual Studio解决方案,其中包含许多API项目,然后这些API项目中包含C#库依赖项。我已成功地将我的解决方案"固定化"。
出现的一个问题是,我的一个C#库中有启动时读取的xml文件。当我独立运行这些库时,路径是C#生成的构建,即:
Debug: C:developmentgemsBackend1DataAPIbinDebugnetcoreapp3.1
Release: C:developmentgemsBackend1DataAPIbinReleasenetcoreapp3.1
XML文件被添加到上面的调试和发布路径中,并且在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"]
复制覆盖数据名称语法看起来不错。本地文件不能存在。
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发布将自行运行还原。
然后,像你在文件中已经做的那样,使用一个更精简的运行时映像来放置你的应用程序。在这一步中,尝试将你需要的任何xml文件复制到base/app中。要在图像中移动文件,您宁愿执行RUN cp dest src
希望以上任何一个都能帮助你,一旦你有了一个简单的设置,你就可以扩展它。