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

Sha*_*tti 6 csproj docker vscode-settings visual-studio-2019

我是 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"]
Run Code Online (Sandbox Code Playgroud)

还附上项目结构图:

结构体

Mat*_*nda 46

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

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

docker build 
  -f "PROJECT_PATH\Dockerfile" 
  -t IMAGE_NAME:dev 
  "SOLUTION_PATH"
Run Code Online (Sandbox Code Playgroud)

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

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

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

  • 我在这里寻找一种使用“docker-compse”的方法,并且您必须设置“build:”-&gt;“context:&lt;项目工作目录&gt;”。就像 `build: context: ./project dockerfile: Dockerfile` 一样,用于根目录中的 ./project/Dockerfile 这样的目录结构。 (2认同)

axt*_*tck 25

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

cd ..

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

.csprojDocker从主机上的当前位置复制和其他文件,因此如果您说:

COPY ["myTestApp.csproj", "./"]
Run Code Online (Sandbox Code Playgroud)

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


onl*_*mas 9

从您的解决方案根目录运行此命令:

docker build . -f [ProjectDir]\Dockerfile


小智 7

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

cd ..

docker build -t imagename:tag -f ProjectDir/Dockerfile .
Run Code Online (Sandbox Code Playgroud)