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
相关产品推荐
相关产品推荐

