我有一个包含多个项目的解决方案。我想创建一个项目的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}"
}
}
}
如果您需要更多信息,请告诉我。
答案 0 :(得分:2)
您正试图将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命令。如果需要父目录的上下文,则需要t耗尽该父目录,因此您可以访问它,当然也可以访问它下的项目。具有讽刺意味的是,对于单个Dockerfile,这并不是您必须真正考虑的事情,因为传统上,当您直接使用Dockerfile时,您没有其他参与的应用程序。相反,在编排多个Docker应用程序时,通常会使用docker-compose.yml
文件,该文件在所有参与应用程序的父级中。无论哪种情况,直接在它们所在的文件夹中运行这些文件都会提供所有必要的上下文。
您的问题是您有效地滑过了这两个概念,因此在运行Docker命令时,您需要更加小心实际上下文。如果您确实有docker-compose.yml,建议您直接运行该文件,而不要直接运行Dockerfile。在Visual Studio中,您只需要添加业务流程支持,而不是直接添加Dockerfile。这将添加Dockerfile,但还添加一个docker-compose项目,然后将创建docker-compose.yml,而不是直接使用Dockerfile构建每个映像。
答案 1 :(得分:0)
正如@Chris Pratt所说,如果解决方案中有多个项目,则最好使用文件docker-compose.yml。但是,如果由于某些原因需要直接使用Dokerfile并指定上下文,则可以将以下行添加到 *。csproj 文件中。
<PropertyGroup>
...
<DockerfileContext>../..</DockerfileContext>
</PropertyGroup>
例如,../..
返回一次。选中here。