首页 文章

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

提问于
浏览
0

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

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目录中完成 . 我已经尝试删除引用libs的两个副本行,但然后构建在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

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

    因此,为了使您的示例正常工作,您需要将构建上下文调整一个级别才能访问 LibReferenceGeneratorFwCore . 然后,相对于该单级向上上下文创建 COPY 指令的源 .

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

    docker image build documentation

  • 0

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

    它应该是:COPY ../../LibReferenceGenerator/LibReferenceGenerator.csproj ../LibReferenceGenerator/

  • 0

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

    如果您需要库,则必须使用(私有)nuget库包含它们 . 它不是一个简洁的解决方案,因为在调试时你没有可用的库的源代码,但在构建上下文之外包含lib是不行的,我学会了研究互联网......

    此外,在微服务环境中,应缩小共享代码,以避免团队破坏其他团队的代码 . 对于所有喜欢为此问题提供解决方案的开发人员而言,对不起,使用nuget软件包的解决方法旁边也没有!

相关问题