【问题标题】:COPY failed: Forbidden path outside the build context: ../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()复制失败:构建上下文之外的禁止路径:../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()
【发布时间】:2019-10-04 17:34:33
【问题描述】:

我有一个包含多个项目的解决方案。我想创建一个项目的 docker 映像,所以我通过 docker 支持添加了一个 Dockerfile。我已将 Dockerfile 添加到的项目对同一级别的其他项目具有构建依赖关系。当我尝试通过 Docker 运行项目时,出现以下错误:

复制失败:构建上下文之外的禁止路径:../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()

C:\Users\user.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets\1.4.10\build\Container.targets(258,5):错误 CTP1001:尝试构建 Docker 镜像。

Dockerfile:

FROM mcr.microsoft.com/dotnet/core/aspnet:2.1-stretch-slim AS base
WORKDIR /app
EXPOSE 80

FROM mcr.microsoft.com/dotnet/core/sdk:2.1-stretch AS build
WORKDIR /src
COPY ["API.Customer/API.Customer.csproj", "API.Customer/"]
COPY ["../API.Common.AspNetCore/API.Common.AspNetCore.csproj", "../API.Common.AspNetCore/"]
COPY ["API.Customer.Eventing/API.Customer.Eventing.csproj", "API.Customer.Eventing/"]
COPY ["API.Customer.Errors.Database.AspNetCore/API.Customer.Errors.Database.AspNetCore.csproj", "API.Customer.Errors.Database.AspNetCore/"]
COPY ["API.Customer.Errors.AspNetCore/API.Customer.Errors.AspNetCore.csproj", "API.Customer.Errors.AspNetCore/"]
RUN dotnet restore "API.Customer/API.Customer.csproj"
COPY . .
WORKDIR "/src/API.Customer"
RUN dotnet build "API.Customer.csproj" -c Release -o /app

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

FROM base AS final
WORKDIR /app
COPY --from=publish /app .
ENTRYPOINT ["dotnet", "API.Customer.dll"]

LaunchSettings.json:

{
  "iisSettings": {
    "windowsAuthentication": false,
    "anonymousAuthentication": true,
    "iisExpress": {
      "applicationUrl": "http://localhost:5002",
      "sslPort": 0
    }
  },
  "profiles": {
    "IIS Express": {
      "commandName": "IISExpress",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev"
      }
    },
    "STARS.API.Customer.Schools": {
      "commandName": "Project",
      "environmentVariables": {
        "ASPNETCORE_ENVIRONMENT": "Dev"
      },
      "applicationUrl": "http://localhost:5002"
    },
    "Docker": {
      "commandName": "Docker",
      "launchUrl": "{Scheme}://localhost:{ServicePort}"
    }
  }
}

如果您需要更多信息,请告诉我。


【问题讨论】:

    标签: c# visual-studio docker asp.net-core visual-studio-2019


    【解决方案1】:

    您正在尝试将 API.Common.AspNetCore 项目复制到您的工作目录 (../) 上方的目录中。那是不可能的。我了解您这样做是因为您需要维护相对项目路径引用,但唯一的方法是将其他项目嵌入更深的目录。例如,不要将API.Customer.csproj 复制到API.Customer/,而是复制到foo/API.Customer/。然后,对于您的 API.Common.AspNetCore 项目,您可以只复制到 API.Common.AspNetCore/

    编辑

    再想一想,错误很可能是由于等式的反面,但上面的部分也是相关的。简而言之,Docker 有一个工作或构建目录的概念,它与运行 Docker 命令的目录有关。如果你在 Windows 上运行 linux 容器,那么这会变得更加有趣,因为整个工作目录实际上都被复制到了在 Hyper-V 中运行的 MobyLinux VM 中。

    无论如何,因此,您需要注意运行 Docker 命令的位置。如果您需要父目录的上下文,那么您需要用完该父目录,这样您就可以访问它,当然也可以访问它下的项目。具有讽刺意味的是,对于单个 Dockerfile,您不必真正考虑这一点,因为传统上,当您直接使用 Dockerfile 时,您没有其他参与的应用程序。相反,当您编排多个 Docker 应用程序时,您通常会使用 docker-compose.yml 文件,该文件位于所有参与应用程序的父级。在任何一种情况下,直接在它们所在的文件夹中运行这些文件都会提供所有必要的上下文。

    你的问题是你有效地滑过这两个概念,所以当你运行你的 Docker 命令时,你需要更加小心你的实际上下文是什么。如果您确实有 docker-compose.yml,我建议您直接运行它而不是 Dockerfile(s)。在 Visual Studio 中,您只需添加编排支持,而不是直接添加 Dockerfile。这将添加 Dockerfile,但添加一个 docker-compose 项目,然后它将向上 docker-compose.yml,而不是直接使用 Dockerfile 构建每个图像。

    【讨论】:

      【解决方案2】:

      正如@Chris Pratt 所说,如果您在解决方案中有多个项目,最好使用文件 docker-compose.yml。但是如果由于某种原因需要直接使用 Dokerfile 并指定上下文,则可以将以下行添加到 *.csproj 文件中。

      <PropertyGroup>
          ...
          <DockerfileContext>../..</DockerfileContext>
      </PropertyGroup>
      

      例如,../.. 返回一次。检查here

      【讨论】:

        猜你喜欢
        • 2020-07-26
        • 1970-01-01
        • 1970-01-01
        • 2016-02-25
        • 2021-02-28
        • 2014-09-05
        • 2020-06-01
        • 2019-05-03
        • 2016-02-14
        相关资源
        最近更新 更多