Azure DevOps构建Docker容器时提示项目文件不存在(MSB1009)的问题
解决Azure DevOps中Docker构建时MSB1009项目文件不存在错误
错误原因
Docker构建上下文与文件复制路径不匹配,导致容器内无法找到指定的项目文件:
- 流水线的
docker build命令以项目根目录(.)作为构建上下文,同时指定src/Dockerfile作为构建文件。 - Dockerfile中执行
COPY . /src时,会将项目根目录下的所有内容(包括src、tests等目录)复制到容器的/src目录中。 - 此时容器内
/src目录下的项目文件实际路径为./src/Project.Api/Project.Api.csproj,但你在Dockerfile中使用dotnet restore ./Project.Api/Project.Api.csproj这个错误的相对路径,导致MSBuild无法找到项目文件。
解决方法
可选择以下两种方案之一:
方案一:修改Dockerfile中的项目路径
调整Dockerfile内dotnet restore和dotnet publish的路径,匹配容器内实际的文件结构:
FROM mcr.microsoft.com/dotnet/aspnet:6.0 AS base WORKDIR /app EXPOSE 80 FROM mcr.microsoft.com/dotnet/sdk:6.0 AS build WORKDIR /src COPY . /src # 修正项目文件路径 RUN dotnet restore ./src/Project.Api/Project.Api.csproj RUN dotnet publish ./src/Project.Api/Project.Api.csproj --no-restore -c Release -o /app FROM build AS publish FROM base AS final WORKDIR /app COPY --from=publish /app . ENTRYPOINT ["dotnet", "Project.Api.dll"]
方案二:修改Docker构建上下文为src目录
调整流水线中的docker build命令,将构建上下文设置为src目录,让Dockerfile里的相对路径匹配实际文件结构:
steps: - bash: | docker login -u $(REGISTRY_USER) -p $REGISTRY_PASSWORD $(REGISTRY_URL) # 将构建上下文改为src目录,Dockerfile默认在该目录下,无需额外指定-f参数 docker build -t $(REGISTRY_URL)/$(IMAGE_REPOSITORY):kkk $(build.sourcesDirectory)/src docker push $(REGISTRY_URL)/$(IMAGE_REPOSITORY):kkk displayName: 'Build and push docker image' env: REGISTRY_PASSWORD: $(REGISTRY_PASSWORD)
若需明确指定Dockerfile路径,也可写成:
docker build -t $(REGISTRY_URL)/$(IMAGE_REPOSITORY):kkk $(build.sourcesDirectory)/src -f $(build.sourcesDirectory)/src/Dockerfile
这种情况下,COPY . /src会将src目录下的内容(Project.Api、Dockerfile)复制到容器的/src,此时./Project.Api/Project.Api.csproj的路径就正确了。
内容的提问来源于stack exchange,提问作者Quyết
相关产品推荐
相关产品推荐

