无法计算缓存键:找不到“.csproj”

问题描述

我是 Docker 的新手。我使用 ASP.Net Core 使用 Visual Studio 2019 以及 VS Code 创建了一个 Web API。它工作正常。然后我添加了 docker 支持添加认值的 Dockerfile。

当我尝试构建 docker 镜像时,它在 Visual Studio 2019 和 VS Code 中都失败了。

但是,如果我尝试使用 Visual Studio 2019 提供的选项(我可以选择 docker 作为运行)运行 Docker 映像,则会创建该映像。 但是当我在 Visual Studio 2019 或 VS Code 中运行 build 命令时,即

docker build -f ./Dockerfile --force-rm -t mytestapp:dev ..
it throws following error<br>
 => ERROR [build 3/7] copY [myTestApp.csproj,./]  
Content of my docker file is given below
FROM mcr.microsoft.com/dotnet/aspnet:5.0 AS base
workdir /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/sdk:5.0 AS build
workdir /src
copY ["myTestApp.csproj","./"]
RUN dotnet restore "myTestApp.csproj"
copY . .
workdir "/src/."
RUN dotnet build "myTestApp.csproj" -c Release -o /app/build

FROM build AS publish
RUN dotnet publish "myTestApp.csproj" -c Release -o /app/publish

FROM base AS final
workdir /app
copY --from=publish /app/publish .
ENTRYPOINT ["dotnet","myTestApp.dll"]

还附上项目结构图:

structure

解决方法

简单的 docker build 命令无法与 Visual Studio 创建的默认 Dockerfile 一起使用,因为路径是相对于解决方案的根目录而不是项目的根目录指定的。

您可以检查 VS 的构建输出以确定它如何构建映像(简化版):

docker build 
  -f "PROJECT_PATH\Dockerfile" 
  -t IMAGE_NAME:dev 
  "SOLUTION_PATH"

如您所见,它使用项目文件夹 (-f) 中的 Dockerfile 构建,但来自解决方案文件夹。

我猜他们这样做是因为它的优点是将每个 Dockerfile 保存在自己的项目文件夹中,同时让您使用更一致的基于解决方案的路径引用该文件夹外的资源。除此之外,它很烦人。

您可以将 Dockefile 移动到解决方案文件夹并保持不变,但是 VS 中的 Docker 功能将停止按预期工作。或者您可以采用 VS 约定并相应地调整您的脚本。

,

我通过提供 docker 命令的绝对路径解决了这个问题。

,

删除您在 WORKDIR "/src/." 中包含的 .(dot)。

,

尝试从父文件夹运行命令。

cd ..

docker build -t sometag:dev -f /ProjectDir/Dockerfile .

,

使用 docker-compose 轻松创建和拆除您的设置。 第一步:将下面的代码保存为“docker-compose.yml”,比你的Dockerfile高一级(与你项目的.sln文件路径相同)

version: '3'
services:
    web:
        build:
            context: .
            dockerfile: [PROJECTNAME]\Dockerfile
        ports:
            - "5000:80"
        networks:
            - aspcore-network
    sql-server:
        image: mcr.microsoft.com/mssql/server
        networks:
            - aspcore-network

networks:
    aspcore-network:
        driver: bridge

步骤 2. 添加附加服务(MYSQL/REDIS/ETC) 步骤 3. 打开终端到 docker-compose.yml 位置 第 4 步。运行“docker-compose build”,然后运行“docker-compose up -d” 步骤 5. 完成后运行“docker-compose down”