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

问题描述 投票:0回答:11

我是 Docker 新手。我使用 Visual Studio 2019 以及 VS Code 中的 ASP.Net Core 创建了一个 Web API。效果很好。然后我添加了 docker 支持并添加了具有默认值的 Dockerfile。

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

但是,如果我尝试使用 Visual Studio 2019 提供的选项(我可以选择 docker 作为运行)运行 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"]

还附上项目结构图:

structure

docker visual-studio-2019 visual-studio-code csproj
11个回答
49
投票

简单的

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 约定并相应地调整您的脚本。


27
投票
尝试从父文件夹运行命令,您可以使用

Dockerfile

 标志指定 
-f
 的路径。

cd ..


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


Docker 副本是主机上当前位置的

.csproj

 和其他文件,所以如果你说:

COPY ["myTestApp.csproj", "./"]
确保您位于主机上的正确目录中。如果您使用其他项目参考,则 Docker 支持创建的 

Dockerfile

 并不总是构建镜像的理想选择,但可以作为一个很好的基础。


9
投票
从解决方案根目录运行此命令:

docker build . -f [ProjectDir]\Dockerfile


    


7
投票
*

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

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

4
投票
使用

docker-compose

 轻松创建和拆除您的设置。

第1步:将下面的代码保存为比您的Dockerfile高一级的目录

docker-compose.yml

(与项目的
.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


    


1
投票
删除 WORKDIR“/src/.”中包含的 .(点)


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


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

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

docker run -it myfirstimage


0
投票
以下是我用来解决此问题的步骤:

  • 我在创建我的

    .NET 5 Web API 项目时选中了启用 Docker

  • 对于

    Docker OS,我选择了Linux

  • 然后我打开一个终端,导航到我的项目所在的目录并输入以下命令:

    docker build -f Movie.WebAPI\Dockerfile --force-rm -t movie-api:v1 .

    
    

得到以下结果:

  • 路径
  • 结果
  • 结果的延续
作为最后一步,我运行了以下命令:

docker run -it --rm -p 8080:80 movie-api:v1


创建了容器镜像。

现在

movie-api 出现 当我输入 docker images

时。


0
投票
在 VisualStudio 设置中(默认为 C:\Users

\AppData\Roaming\Code\User\settings.json),您可以更改默认值:

"docker.commands.build": "${containerCommand} build --pull --rm -f \"${dockerfile}\" -t ${tag} \"${context}\"",

"docker.commands.build": "${containerCommand} build --pull --rm -f \"${dockerfile}\" -t ${tag} \"${workspaceFolder}\"",
    

0
投票
如果您的项目是 VS 解决方案的一部分,那么解决方案文件夹将是您的“DockerfileContext”,并且所有 Docker 文件路径都应与该文件夹相关。

如果您的项目不是 VS 解决方案的一部分,那么您可以控制/设置编辑 csproj 文件 (.) 的“DockerfileContext”。

© www.soinside.com 2019 - 2024. All rights reserved.