You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Windows Dockerfile无法将文件复制到base镜像的/app目录

问题根源

你遇到的问题核心在于Docker多阶段构建的覆盖逻辑:

  • 你在base阶段把globalkafkasettings.json复制到了/app目录,但最终运行的是final阶段——这个阶段基于base镜像后,执行了COPY --from=publish /app/publish .,该命令会将publish阶段生成的所有内容完全覆盖到当前工作目录(即/app),所以之前复制到/app的文件被替换掉了。
  • 当你把目标目录改成/test/时,这个目录不在后续覆盖的范围内,因此文件能正常保留。
解决方案

提供三种可行的解决思路,按需选择:

方案1:将文件复制步骤移到final阶段

把复制文件的操作放到final阶段的最后,确保不会被publish的内容覆盖:

# ... 其他阶段保持不变 ...
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
# 在这里复制文件,避免被覆盖
COPY ["Common.Utils/globalkafkasettings.json", "/app/"]
ENTRYPOINT ["dotnet", "API.dll"]

方案2:利用csproj配置自动同步到publish目录

既然你已经在csproj里配置了CopyToOutputDirectory,只需添加CopyToPublishDirectory配置,让dotnet publish自动把文件包含到输出目录,无需手动在Dockerfile里复制:
修改API项目的csproj配置:

<Content Include="..\Common.Utils\globalkafkasettings.json">
  <CopyToOutputDirectory>Always</CopyToOutputDirectory>
  <CopyToPublishDirectory>Always</CopyToPublishDirectory>
</Content>

之后dotnet publish会自动把文件带到/app/publish目录,final阶段执行COPY --from=publish /app/publish .时就会同步到容器的/app目录。

方案3:在publish阶段提前复制文件

在publish阶段把文件复制到输出目录,这样final阶段同步时自然会包含:

FROM build AS publish
ARG BUILD_CONFIGURATION=Release
RUN dotnet publish "./API.csproj" -c %BUILD_CONFIGURATION% -o /app/publish /p:UseAppHost=false
# 复制文件到publish输出目录
COPY ["Common.Utils/globalkafkasettings.json", "/app/publish/"]
额外注意

确保执行docker build命令时,当前工作目录是你的解决方案根目录(即包含API、Common.Utils文件夹的目录),否则Docker构建上下文找不到Common.Utils/globalkafkasettings.json文件。

内容的提问来源于stack exchange,提问作者Faradey Inimicos

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.06.17 07:45:17