VS2022创建的Docker支持项目执行docker build提示找不到csproj文件
问题原因
报错的核心原因是Docker构建上下文路径与Dockerfile内COPY指令的相对路径规则不匹配:
- Visual Studio 自动为项目添加Docker支持时,默认会以解决方案/仓库根目录作为构建上下文,因此自动生成的Dockerfile中
COPY ["ProjectService/ProjectService.csproj", "ProjectService/"]、COPY ["DatabaseManager/DatabaseManager.csproj", "DatabaseManager/"]这类路径,都是相对于仓库根目录编写的。VS内部执行构建时会自动传入正确的上下文参数,因此可以正常完成构建调试。 - 第一次执行构建命令
docker build -t myrep/demo:latest ./ProjectService时,手动将构建上下文设置为./ProjectService目录。Docker构建过程中所有COPY操作的源文件都必须位于构建上下文目录内,既不能访问上下文外的文件,路径层级也要和上下文内的实际结构对应:- 该上下文的根目录就是ProjectService文件夹,内部直接存放
ProjectService.csproj,不存在ProjectService/ProjectService.csproj的层级 - 同级的DatabaseManager文件夹完全处于构建上下文范围之外,根本无法被访问,因此触发文件找不到的报错。
- 该上下文的根目录就是ProjectService文件夹,内部直接存放
- 进入ProjectService目录后执行构建命令,本质还是将ProjectService目录作为构建上下文,和上述问题完全一致,自然会报相同的错误。
解决方案
现有Dockerfile的配置本身没有问题,不需要修改内容(修改后反而会导致VS内的Docker调试功能失效),只需要调整构建命令的参数即可:
- 执行命令前先切换到仓库根目录(也就是同时包含ProjectService、DatabaseManager两个子文件夹的root目录)
- 由于Dockerfile存放在ProjectService子目录下,需要通过
-f参数显式指定Dockerfile的路径,同时将构建上下文设置为当前的仓库根目录,完整命令如下:
docker build -t myrep/demo:latest -f ./ProjectService/Dockerfile .
命令末尾的.就是指定构建上下文为当前目录(仓库根目录),此时构建环境和VS内部执行构建时的环境完全一致,Docker可以正常访问两个项目的所有文件,即可顺利完成镜像构建。
注意:由于ProjectService依赖DatabaseManager项目,构建上下文必须包含两个项目的公共父目录(即仓库根目录),否则永远无法将依赖项目的文件拷贝到镜像中完成构建。
内容的提问来源于stack exchange,提问作者MakePeaceGreatAgain
相关产品推荐
相关产品推荐

