COPY 失败:构建上下文之外的禁止路径:../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()
COPY failed: Forbidden path outside the build context: ../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()
我有一个包含多个项目的解决方案。我想创建一个项目的 docker 图像,所以我通过 docker 支持添加了一个 Docker 文件。我添加了 Docker 文件的项目对同一级别的其他项目具有构建依赖性。当我尝试通过 Docker 运行 项目时,出现以下错误:
COPY failed: Forbidden path outside the build context: ../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()
C:\Users\user.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets.4.10\build\Container.targets(258,5): error CTP1001: An error occurred while attempting to build Docker image.
Docker文件:
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}"
}
}
}
如果您需要更多信息,请告诉我。
您正在尝试将 API.Common.AspNetCore
项目复制到您的工作目录 (../
) 之上的目录中。那是不可能的。我知道你这样做是因为你需要维护相对项目路径引用,但唯一的方法是将其他项目嵌入一个目录深处。例如,不是将 API.Customer.csproj
复制到 API.Customer/
,而是复制到 foo/API.Customer/
。然后,对于您的 API.Common.AspNetCore
项目,您可以只复制到 API.Common.AspNetCore/
.
编辑
仔细想想,错误可能是等式的反面,但上面的部分也是相关的。简而言之,Docker 有一个工作目录或构建目录的概念,它与 Docker 命令从中 运行 的目录相关。如果您在 Windows 上 运行ning linux 容器,那么这将变得更加有趣,因为整个工作目录实际上被复制到 MobyLinux VM 运行ning 中 Hyper-V.
无论如何,正因为如此,您需要小心 运行 执行 Docker 命令的位置。如果你需要一个父目录的上下文,那么你需要 运行 离开那个父目录,这样你就可以访问它,当然还有你的项目在它下面。具有讽刺意味的是,对于单个 Docker 文件,这不是您必须真正考虑的事情,因为传统上,当您直接使用 Docker 文件时,您没有其他参与的应用程序。相反,当您编排多个 Docker 应用程序时,您通常会使用 docker-compose.yml
文件,该文件位于所有参与应用程序的父级别。在任何一种情况下,运行将这些文件直接放在它们所在的文件夹中将提供所有必要的上下文。
你的问题是你有效地滑冰了这两个概念,所以当你 运行 你的 Docker 命令时,你需要更加小心你的实际上下文是什么。如果您确实有 docker-compose.yml,我建议您 运行ning 而不是直接 Docker 文件。在 Visual Studio 中,您只需添加编排支持,而不是直接添加 Docker 文件。这将添加 Docker 文件,但 还 添加一个 docker-compose 项目,然后它将启动 docker-compose.yml,而不是构建每个图像直接使用 Docker 文件。
正如@Chris Pratt 所说,如果解决方案中有多个项目,最好使用文件 docker-compose.yml。但是如果出于某种原因你需要直接使用 Dokerfile 并指定上下文,你可以将以下行添加到你的 *.csproj 文件中。
<PropertyGroup>
...
<DockerfileContext>../..</DockerfileContext>
</PropertyGroup>
例如../..
返回一次。检查 here.
我有一个包含多个项目的解决方案。我想创建一个项目的 docker 图像,所以我通过 docker 支持添加了一个 Docker 文件。我添加了 Docker 文件的项目对同一级别的其他项目具有构建依赖性。当我尝试通过 Docker 运行 项目时,出现以下错误:
COPY failed: Forbidden path outside the build context: ../API.Common.AspNetCore/API.Common.AspNetCore.csproj ()
C:\Users\user.nuget\packages\microsoft.visualstudio.azure.containers.tools.targets.4.10\build\Container.targets(258,5): error CTP1001: An error occurred while attempting to build Docker image.
Docker文件:
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}"
}
}
}
如果您需要更多信息,请告诉我。
您正在尝试将 API.Common.AspNetCore
项目复制到您的工作目录 (../
) 之上的目录中。那是不可能的。我知道你这样做是因为你需要维护相对项目路径引用,但唯一的方法是将其他项目嵌入一个目录深处。例如,不是将 API.Customer.csproj
复制到 API.Customer/
,而是复制到 foo/API.Customer/
。然后,对于您的 API.Common.AspNetCore
项目,您可以只复制到 API.Common.AspNetCore/
.
编辑
仔细想想,错误可能是等式的反面,但上面的部分也是相关的。简而言之,Docker 有一个工作目录或构建目录的概念,它与 Docker 命令从中 运行 的目录相关。如果您在 Windows 上 运行ning linux 容器,那么这将变得更加有趣,因为整个工作目录实际上被复制到 MobyLinux VM 运行ning 中 Hyper-V.
无论如何,正因为如此,您需要小心 运行 执行 Docker 命令的位置。如果你需要一个父目录的上下文,那么你需要 运行 离开那个父目录,这样你就可以访问它,当然还有你的项目在它下面。具有讽刺意味的是,对于单个 Docker 文件,这不是您必须真正考虑的事情,因为传统上,当您直接使用 Docker 文件时,您没有其他参与的应用程序。相反,当您编排多个 Docker 应用程序时,您通常会使用 docker-compose.yml
文件,该文件位于所有参与应用程序的父级别。在任何一种情况下,运行将这些文件直接放在它们所在的文件夹中将提供所有必要的上下文。
你的问题是你有效地滑冰了这两个概念,所以当你 运行 你的 Docker 命令时,你需要更加小心你的实际上下文是什么。如果您确实有 docker-compose.yml,我建议您 运行ning 而不是直接 Docker 文件。在 Visual Studio 中,您只需添加编排支持,而不是直接添加 Docker 文件。这将添加 Docker 文件,但 还 添加一个 docker-compose 项目,然后它将启动 docker-compose.yml,而不是构建每个图像直接使用 Docker 文件。
正如@Chris Pratt 所说,如果解决方案中有多个项目,最好使用文件 docker-compose.yml。但是如果出于某种原因你需要直接使用 Dokerfile 并指定上下文,你可以将以下行添加到你的 *.csproj 文件中。
<PropertyGroup>
...
<DockerfileContext>../..</DockerfileContext>
</PropertyGroup>
例如../..
返回一次。检查 here.