我有一个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 回答
如错误所示,您无法复制构建上下文之外的文件 . 当您运行
docker image build .
之类的命令时,最后一个参数(.
)指定构建上下文 . 该上下文被复制到Docker引擎进行构建 . 外面的文件(例如,../LibReferenceGenerator/LibReferenceGenerator.csproj
)根本不存在 .因此,为了使您的示例正常工作,您需要将构建上下文调整一个级别才能访问
LibReferenceGenerator
和FwCore
. 然后,相对于该单级向上上下文创建COPY
指令的源 .请注意,Dockerfile的默认位置是构建上下文中名为
Dockerfile
的文件 . 您需要移动Dockerfile,或使用-f, --file
选项指定自定义路径 .docker image build documentation
您在副本中缺少一个级别 .
它应该是:COPY ../../LibReferenceGenerator/LibReferenceGenerator.csproj ../LibReferenceGenerator/
答案是,没有解决方案......
如果您需要库,则必须使用(私有)nuget库包含它们 . 它不是一个简洁的解决方案,因为在调试时你没有可用的库的源代码,但在构建上下文之外包含lib是不行的,我学会了研究互联网......
此外,在微服务环境中,应缩小共享代码,以避免团队破坏其他团队的代码 . 对于所有喜欢为此问题提供解决方案的开发人员而言,对不起,使用nuget软件包的解决方法旁边也没有!