VS2019生成的Dockerfile手动执行docker build、docker-compose路径报错如何修正
问题根因
Docker构建过程存在上下文目录限制:默认以执行docker build命令的当前目录作为上下文,构建过程中不允许访问上下文之外的上级目录(也就是你写的../路径会完全失效)。
VS2019启动Docker项目时会自动以整个解决方案的根目录作为构建上下文,所以可以正常识别跨项目引用;你手动在App.Server目录下执行构建时,上下文只有App.Server内部的文件,自然找不到同级的App.Components和上级的serverbackend目录。
修正步骤
- 调整文件位置
把docker-compose.yml移动到整个解决方案的根目录,也就是和App.Server、App.Components、serverbackend三个文件夹同级的位置,Dockerfile可以继续保留在App.Server目录下,最终目录结构如下:
解决方案根目录/ ├── App.Server/ │ ├── Dockerfile │ └── App.Server.csproj ├── App.Components/ │ └── App.Components.csproj ├── serverbackend/ │ └── CL.Logic/ │ └── CL.Logic.fsproj └── docker-compose.yml
- 修改docker-compose.yml配置
指定构建上下文为解决方案根目录,同时明确Dockerfile的路径:
version: '3.9' services: app: build: context: . dockerfile: ./App.Server/Dockerfile ports: - 80:80 - 443:443
- 修正Dockerfile的COPY路径
删除第三行COPY命令的../前缀,所有源路径直接相对于解决方案根目录填写:
FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build WORKDIR /src # 以下路径均相对于解决方案根目录(构建上下文) COPY ["App.Server/App.Server.csproj", "App.Server/"] COPY ["App.Components/App.Components.csproj", "App.Components/"] COPY ["serverbackend/CL.Logic/CL.Logic.fsproj", "serverbackend/CL.Logic/"] # 后续其余配置无需修改 RUN dotnet restore "App.Server/App.Server.csproj" COPY . . WORKDIR "/src/App.Server" RUN dotnet build "App.Server.csproj" -c Release -o /app/build
验证操作
在解决方案根目录下执行以下命令即可正常构建启动:
- docker-compose方式:
docker-compose up --build - 单独docker build方式:
docker build -f ./App.Server/Dockerfile .
内容的提问来源于stack exchange,提问作者Wojciech Szabowicz
相关产品推荐
相关产品推荐

