如何使用项目解决方案创建docker容器,其中lib项目位于比建筑物上下文高一级的位置

时间:2018-08-15 16:55:41

标签: docker .net-core visual-studio-2017 docker-compose solution

我有一个VS2017(v5.18.0)解决方案,其中包含一个.NET Core 2.0控制台应用程序“ ReferenceGenerator”作为“启动”应用程序。该解决方案还包含两个.Net Core库2.0项目FwCore和LibReferenceGenerator,它们是“本地”库。我添加了Docker支持(Linux),因此添加了创建Docker应用程序所需的所有文件。我可以使用“用于Linux模式下的Windows的docker”在“ docker-compose”模式下调试应用程序。应用程序运行正常。如果尝试构建发行版本,则会收到错误消息,指出从非法路径发生了COPY。码头工人文件看起来像这样:

FROM microsoft/dotnet:2.0-runtime AS base
WORKDIR /app

FROM microsoft/dotnet:2.0-sdk AS build
WORKDIR /src
COPY ReferenceGenerator/ReferenceGenerator.csproj 
ReferenceGenerator/
COPY ../LibReferenceGenerator/LibReferenceGenerator.csproj ../LibReferenceGenerator/
COPY ../FwCore/FwCore/FwCore.csproj ../FwCore/FwCore/
RUN dotnet restore 
ReferenceGenerator/ReferenceGenerator.csproj
COPY . .
WORKDIR /src/ReferenceGenerator
RUN dotnet build ReferenceGenerator.csproj -c Release -o /app

FROM build AS publish
RUN dotnet publish ReferenceGenerator.csproj -c Release -o /app

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

内容下方的行:

COPY ../LibReferenceGenerator/LibReferenceGenerator.csproj ../LibReferenceGenerator/

正在导致错误:

Step 6/17 : COPY ../LibReferenceGenerator/LibReferenceGenerator.csproj ../LibReferenceGenerator/
1>Service 'referencegenerator' failed to build: COPY failed: Forbidden path outside the build context: ../LibReferenceGenerator/LibReferenceGenerator.csproj ()

我已经读到不允许相对路径,就是这样。但是,编译器的输出已在项目ReferenceGenerator的bin目录中完成。我已经尝试删除引用lib的两条复制行,但是在dotnet构建阶段,构建抱怨缺少lib工程文件。

在我看来,在解决方案中包含一些“ homebuild” lib项目是很常见的情况。我是docker容器上的新手,不知道该如何解决这个问题,有人吗?

我的文件结构的其他信息如下:

/Production/ReferenceGenerator/ReferenceGenerator.sln
/Production/ReferenceGenerator/ReferenceGenerator/ReferenceGenerator.csproj
/Production/LibReferenceGenerator/LibReferenceGenerator.csproj
/Production/FwCore/FwCore/FwCore.csproj
/Production/ReferenceGenerator/ReferenceGenerator/Dockerfile

请任何人。试图帮助我的人没有成功。我完全陷在开发中了...

3 个答案:

答案 0 :(得分:1)

答案是,没有解决方案...

如果需要库,则必须使用(私有)nuget库将它们包括在内。 这不是一个很好的解决方案,因为在调试时您没有可用的库资源,但是在构建上下文之外包含库是不可行的,我从中学到了对互联网的研究...

在微服务环境中,共享代码也应最小化,以避免团队破坏其他团队的代码。对所有希望为该问题提供解决方案的开发人员表示歉意,此外,除了使用nuget包的解决方法之外,没有其他解决方案!

答案 1 :(得分:0)

您在副本中缺少一个级别。

应为: COPY ../../LibReferenceGenerator/LibReferenceGenerator.csproj ../ LibReferenceGenerator /

答案 2 :(得分:0)

如错误所示,您不能复制构建上下文之外的文件。当您运行诸如docker image build .之类的命令时,最后一个参数(.)指定构建上下文。该上下文将复制到Docker引擎进行构建。除此之外的文件(例如../LibReferenceGenerator/LibReferenceGenerator.csproj)根本不存在。

因此,为了使您的示例正常工作,您需要将构建上下文上调至一个级别才能访问LibReferenceGeneratorFwCore。然后,将COPY指令的来源作为该上一级上下文的相关内容。

请注意,Dockerfile的默认位置是在您的构建上下文中名为Dockerfile的文件。您需要移动Dockerfile,或使用-f, --file选项指定自定义路径。

docker image build documentation