Dockerfile引用父级目录nuget.config提示不存在该如何处理
问题根源
Docker 构建存在上下文路径限制:构建过程中只能访问上下文目录以内的文件,无法访问上层目录的资源。你本地IDE的路径提示是基于操作系统完整文件结构的解析,和Docker构建的隔离上下文无关,所以才会出现本地路径合法但Docker构建报错的情况。
正确处理方案(通用标准方案)
调整构建上下文为解决方案根目录,不需要为每个项目重复存放nuget.config,具体修改如下:
第一步:修改docker-compose.yml配置
在docker-compose中为每个服务的build节点指定上下文为解决方案根目录(如果你的docker-compose.yml本身就存放在sln根目录,直接写./即可),同时指定Dockerfile的相对路径:
services: project1: build: context: ./ # 上下文设为sln根目录 dockerfile: ./Project1/src/Project1/Dockerfile # 从上下文出发指定Dockerfile路径 # 其他原有配置保持不变
第二步:修改Dockerfile内的复制路径
因为构建上下文已经是sln根目录,所有路径都要基于根目录填写:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build-env WORKDIR /app ENV NUGET_USER=user ARG NUGET_TOKEN ENV NUGET_TOKEN=$NUGET_TOKEN # 基于sln根目录复制csproj和全局nuget.config COPY ["Project1/src/Project1/Project1.csproj", "Project1/src/Project1/"] COPY nuget.config ./ RUN dotnet restore "Project1/src/Project1/Project1.csproj" # 复制项目所有代码 COPY ./Project1/src/Project1 ./Project1/src/Project1 WORKDIR /app/Project1/src/Project1 RUN dotnet build "Project1.csproj" -c Release -o /app/build FROM build-env AS publish RUN dotnet publish "Project1.csproj" -c Release -o /app/out # 构建运行时镜像 FROM mcr.microsoft.com/dotnet/aspnet:5.0 COPY --from=publish /app/out . ENV ASPNETCORE_URLS=http://+:8080 EXPOSE 8080 ENTRYPOINT ["dotnet", "Project1.dll"]
可选方案:本地手动构建时的处理
如果你不用docker-compose,直接执行docker build命令,手动指定上下文为sln根目录即可:
# 在sln根目录下执行 docker build -f ./Project1/src/Project1/Dockerfile .
内容的提问来源于stack exchange,提问作者Paul DeVito
相关产品推荐
相关产品推荐

