无法计算缓存键:找不到“.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
我是 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