ASP.NET Core项目IDE内置Docker运行正常,手动build时报找不到.csproj文件
手动执行Docker构建报
csproj not found的排查与解决 问题核心原因
- Visual Studio 2019/VS Code 内置的Docker调试流程,会自动匹配Dockerfile的存放位置设置正确的构建上下文路径,因此默认配置下可以正常完成镜像构建、启动容器。
- 手动执行构建命令时抛出
Failed to compute cache key: ".csproj" not found错误,本质是构建上下文和Dockerfile内的文件相对路径不匹配:Docker执行COPY指令时,只能访问指定构建上下文范围内的文件,当上下文路径下不存在目标csproj文件时,构建流程会直接中断。
VS自动生成的ASP.NET Core Dockerfile默认存放在项目根目录(即存放myTestApp.csproj文件的同一文件夹下),Dockerfile内的COPY路径是基于该项目目录书写的。手动执行构建时如果把上下文设置成了项目目录的上一级(即解决方案根目录),Docker会直接在解决方案根目录下查找myTestApp.csproj,而实际csproj文件存放在子层级的项目文件夹中,自然会出现文件找不到的报错。
可直接落地的解决方法
- 方法一(零代码修改,最适配默认Dockerfile配置):
将终端的工作目录切换到存放Dockerfile和myTestApp.csproj的同一项目文件夹下,把构建命令的上下文参数从原来的..改成当前目录.:docker build -f ./Dockerfile --force-rm -t mytestapp:dev . - 方法二(不切换终端目录,保留在解决方案根目录执行命令):
修改Dockerfile中涉及项目文件拷贝的路径,补上项目子目录的层级,适配解决方案根目录的构建上下文:
将原Dockerfile中的:
调整为:COPY ["myTestApp.csproj", "./"] RUN dotnet restore "myTestApp.csproj"
后续的COPY ["myTestApp/myTestApp.csproj", "./"] RUN dotnet restore "myTestApp.csproj"COPY . .、项目构建、发布指令无需额外修改,即可正常匹配解决方案根目录的上下文范围。
新手避坑提示
- Dockerfile中所有COPY、ADD指令书写的文件路径,都是相对于构建上下文根目录的相对路径,并非相对于Dockerfile文件本身的存放路径。只有被纳入构建上下文扫描范围的文件,才能被拷贝到镜像内。
内容的提问来源于stack exchange,提问作者Shahid Riaz Bhatti
相关产品推荐
相关产品推荐

