ASP.NET Core Docker项目构建中Program.cs未被COPY复制的问题
出现这个问题的核心原因大概率是以下几种情况之一:
1. .dockerignore 文件排除了 Program.cs
Visual Studio 生成的 Docker 项目会自动创建 .dockerignore 文件,如果你不小心在里面添加了 Program.cs、*.cs 这类规则,COPY . . 命令会直接跳过这些被忽略的文件,导致容器内的构建目录下没有 Program.cs,触发 CS5001 错误。
检查你的 .dockerignore 文件,确保没有包含排除 .cs 文件或 Program.cs 的规则。
2. Docker 构建缓存复用了旧层
Docker 会对每一步构建结果进行缓存,如果你之前构建时,COPY . . 对应的缓存层里就没有包含 Program.cs(比如第一次构建时 Program.cs 还未创建、或者当时被 .dockerignore 排除),那么后续构建时 Docker 会直接复用这个旧缓存层,即使你现在的构建上下文里有 Program.cs,也不会重新复制。
解决方法是强制跳过缓存重新构建:
docker build --no-cache -t TempWorkerService .
3. 路径匹配或 WORKDIR 配置问题
如果你的项目结构是多层目录(比如 Program.cs 在子文件夹 TempWorkerService/ 下),而 Dockerfile 中的 WORKDIR 和 COPY 路径配合出错,可能导致 dotnet build 找不到正确位置的 Program.cs。
比如,假设你的 Dockerfile 中先切换到 /src 目录,复制 csproj 到 /src/TempWorkerService/,但 COPY . . 是把构建上下文的所有内容复制到 /src,此时 Program.cs 应该在 /src/TempWorkerService/ 下,但如果之前的缓存或路径配置错误,可能导致该文件没有被正确复制到目标位置。而单独添加 COPY TempWorkerService/Program.cs TempWorkerService/ 会强制将该文件复制到正确路径,所以构建成功。
内容的提问来源于stack exchange,提问作者Serge

