如何为.NET解决方案构建带有多个依赖项的Docker镜像?

6

这可能有点长,但我认为很容易阅读...那么我们开始吧...

我使用IoT Edge工具创建了一个物联网边缘解决方案。 它生成的Dockerfile非常适用于没有外部DLL依赖项的项目。

当我在此模块(MyEdgeModule)中添加多个DLL(MySqlAdapterBaseAdapterHelper)时,不更改Dockerfile尝试构建图像时,问题就出现了。

它会抛出一个错误:

跳过项目“/MySqlAdapter/MySqlAdapter.csproj”,因为未找到该项目。 跳过项目“/MySqlAdapter/MySqlAdapter.csproj”,因为未找到该项目。

...

... : 警告 : 引用的项目 '../MySqlAdapter/MySqlAdapter.csproj' 不存在。[/app/MyEdgeModule.csproj]

以下是 MyEdgeModule 生成的 Dockerfile。

FROM microsoft/dotnet:2.1-sdk AS build-env
WORKDIR /app

COPY *.csproj ./
RUN dotnet restore

COPY *.csproj ./
RUN dotnet restore

COPY . ./
RUN dotnet publish -c Release -o out

FROM microsoft/dotnet:2.1-runtime-stretch-slim
WORKDIR /app
COPY --from=build-env /app/out ./

RUN useradd -ms /bin/bash moduleuser
USER moduleuser

ENTRYPOINT ["dotnet", "MyEdgeModule.dll"]

这些类库项目位于 Dockerfile 的 "../{projname}/*.csproj" 处。
因此,我尝试将这些项目相对地添加到 Dockerfile 中,以便查看是否可以工作,但没有成功。
我甚至从 documentation 上了解到:
引用: 路径必须在构建的上下文中;您不能复制 ../something /something,因为 docker build 的第一步是将上下文目录(及其子目录)发送到 docker 守护程序。
据我所知,我的 context 是我试图返回查找依赖项目的文件夹,这似乎是不可能的。
如何为此项目创建镜像,假设它有几十个外部 DLL 作为依赖项?
2个回答

5

现在可行的方法是创建一个全新的.NET Core项目,使用Add Docker Support,每次生成都会刷新Dockerfile,并添加所有引用的依赖项。

为使Dockerfile正常工作,必须将其移动到解决方案目录中,而不是生成它的项目文件夹中。


1
你是在制作整个解决方案的Docker镜像吗?这太荒谬了。 - Jeremy Holovacs
1
@ErçinDedeoğlu,我已经等了你的建议三年了。 - gneric

0

自动生成的 Dockerfile 在我的情况下不起作用。

COPY failed: stat /var/lib/docker/tmp/docker-builder471019165/src/server/MyWebService/MyWebService.csproj: no such file or directory

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接