Docker环境下ASP.NET Core无法找到programminglanguage.js文件求助
解决Docker环境下ASP.NET Core无法找到programminglanguage.js文件的问题
问题说明
本地开发时,ASP.NET Core应用可正常读取programminglanguage.js文件初始化数据库,但Docker环境运行时提示文件找不到。docker compose build构建成功,但运行时抛出以下错误:
2024-09-21 04:40:15 Unhandled exception. System.IO.FileNotFoundException: Could not find file '/app/..\..\..\..\..\mock\programminglanguages\programminglanguage.js'
现有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" ]
文件读取代码
string baseDir = AppDomain.CurrentDomain.BaseDirectory; string relativePath = @"..\..\..\..\..\mock\programminglanguages\programminglanguage.js"; string fullPath = Path.GetFullPath(Path.Combine(baseDir, relativePath));
项目结构
根目录下包含:
mock文件夹:内有programminglanguages/programminglanguage.jssrc文件夹:包含Technologies等多个子项目- 解决方案文件
TotechsThunder.sln
已尝试操作
- 尝试检查容器内文件,但不熟悉发布版Docker环境的文件系统,未完成排查
期望结果
programminglanguage.js能被正确复制到容器内- 现有相对路径代码无需修改即可找到文件
解决方案:保持容器内目录结构与本地一致
问题核心是Docker最终镜像的目录结构与本地开发环境不一致,导致相对路径解析失败。修改Dockerfile,让容器内的目录结构和本地匹配:
FROM mcr.microsoft.com/dotnet/sdk:8.0 as build WORKDIR /app EXPOSE 80 # 复制整个项目结构(替代单个文件/项目文件的复制,更简洁) COPY TotechsThunder.sln TotechsThunder.sln COPY mock/ mock/ COPY src/ src/ RUN dotnet restore TotechsThunder.sln WORKDIR /app/src/Technologies # 发布到和本地一致的目录结构 RUN dotnet publish -c Release -o ./bin/Release/net8.0/publish FROM mcr.microsoft.com/dotnet/aspnet:8.0 WORKDIR /app # 复制mock文件夹和发布后的文件,保持本地目录结构 COPY --from=build /app/mock/ mock/ COPY --from=build /app/src/Technologies/bin/Release/net8.0/publish src/Technologies/bin/Release/net8.0/publish # 切换到和本地一致的发布目录作为工作目录 WORKDIR /app/src/Technologies/bin/Release/net8.0/publish ENTRYPOINT [ "dotnet", "Technologies.dll" ]
验证容器内文件的方法
如果需要确认文件是否存在,可运行以下命令进入容器查看:
# 替换为你的镜像名称或容器ID docker run -it --entrypoint bash your-image-name # 查看目录结构 ls -R /app
内容的提问来源于stack exchange,提问作者strypperjason115
相关产品推荐
相关产品推荐

