问题
这是我的Dockerfile
:
FROM mcr.microsoft.com/dotnet/sdk:8.0 as build
WORKDIR /app
EXPOSE 80
COPY TotechsThunder.sln TotechsThunder.sln
COPY mock/programminglanguages/programminglanguage.js mock/programminglanguages/programminglanguage.js
COPY src/LightningLanes/API/LightningLanes.csproj src/LightningLanes/API/LightningLanes.csproj
COPY src/LightningLanes/Core/LightningLanes.Core/LightningLanes.Core.csproj src/LightningLanes/Core/LightningLanes.Core/LightningLanes.Core.csproj
COPY src/LightningLanes/Jobs/LightningLanes.HangfireJobHost/LightningLanes.HangfireJobHost.csproj src/LightningLanes/Jobs/LightningLanes.HangfireJobHost/LightningLanes.HangfireJobHost.csproj
COPY src/Features/GitHubFeatures/Logics/Logics.csproj src/Features/GitHubFeatures/Logics/Logics.csproj
COPY src/Features/GitHubFeatures/Tests/Tests.csproj src/Features/GitHubFeatures/Tests/Tests.csproj
COPY src/Technologies/Technologies.csproj src/Technologies/Technologies.csproj
COPY src/Projects/Projects.csproj src/Projects/Projects.csproj
COPY src/Contracts/Contracts.csproj src/Contracts/Contracts.csproj
COPY src/IdentityServer/IdentityServer.csproj src/IdentityServer/IdentityServer.csproj
COPY src/Gateway/Gateway.csproj src/Gateway/Gateway.csproj
RUN dotnet restore TotechsThunder.sln
COPY src/Technologies src/Technologies
COPY src/Contracts src/Contracts
WORKDIR /app/src/Technologies
RUN dotnet publish -c Release -o /app/src/out
FROM mcr.microsoft.com/dotnet/aspnet:8.0
WORKDIR /app
COPY --from=build /app/src/out .
ENTRYPOINT [ "dotnet", "Technologies.dll" ]
在使用该文件时遇到了麻烦programminglanguage.js
。此文件包含主数据,我的ASP.NET Core
应用程序在初始化期间使用这些数据将数据植入数据库迁移。在我的开发环境中,一切正常,但当我在Docker
环境中运行该项目时,找不到该文件。
当运行时docker compose build
,服务构建成功。但当项目在Docker
中运行时,我遇到以下错误:
2024-09-21 04:40:15 Unhandled exception. System.IO.FileNotFoundException: Could not find file '/app/..\..\..\..\..\mock\programminglanguages\programminglanguage.js'
这是我在迁移期间用于读取文件以进行播种的代码:
string baseDir = AppDomain.CurrentDomain.BaseDirectory;
string relativePath = @"..\..\..\..\..\mock\programminglanguages\programminglanguage.js";
string fullPath = Path.GetFullPath(Path.Combine(baseDir, relativePath));
在Docker
中,问题似乎源于相对文件路径未正确解析。
我的项目中的文件位置
确实尝试过:尝试检查docker
容器内部是否有programminglanguage.js
文件,但release + docker
环境文件系统对我来说太陌生了,无法进行调查
我的期望是:programminglanguage.js
被复制到容器内,路径为
string relativePath = @"..\..\..\..\..\mock\programminglanguages\programminglanguage.js";
检索文件不应该导致没有文件
解决方案
问题在于使用反斜杠\
而不是正常斜杠,因为Docker
运行基于Linux
的镜像,Windows
文件路径将无法很好地识别