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

Failed to compute cache key: ".csproj" not found

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

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

但是,如果我尝试使用 Visual Studio 2019 提供的选项 运行 Docker 图像(我可以 select docker 作为 运行),然后创建图像。 但是当我 运行 Visual Studio 2019 或 VS Code 中的构建命令时,即

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"]

同时附上项目结构图:

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

从父文件夹尝试 运行 命令,您可以使用 -f 标志指定 Dockerfile 的路径。

cd ..

docker build -t imagename:tag -f /ProjectDir/Dockerfile .

Docker 从主机当前位置复制 .csproj 和其他文件,所以如果你说:

COPY ["myTestApp.csproj", "./"]

确保您在主机上的正确目录中。 Dockerfile 由 Docker 创建的支持并不总是构建图像的理想选择,如果您使用其他项目参考,但可以作为一个很好的基础。

一个简单的 docker build 命令无法处理由 Visual Studio 创建的默认 Docker 文件,因为路径是相对于解决方案的根指定的,而不是相对于解决方案的根指定的项目。

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

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

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

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

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

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

使用 docker-compose 轻松创建和拆除您的设置。

第 1 步:将下面的代码保存为 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

运行 来自您的解决方案根目录:

docker build . -f [ProjectDir]\Dockerfile

*@axtc*k 的回答对我有用。使其工作所需的唯一更改是删除斜杠:

cd ..

docker build -t imagename:tag -f ProjectDir/Dockerfile .

相反,使用 .sln 文件转到父目录并使用 docker -f 选项指定要在子文件夹中使用的 Dockerfile:

cd \CoreDockerAPI docker build -f CoreDockerAPI\Dockerfile --force-rm -t myfirstimage .

docker 运行 -it myfirstimage