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

gne*_*ric 6 c# docker dockerfile azure-iot-edge

它可能有点长,但我认为它很容易阅读......所以让我们开始......

我有一个使用IoT Edge Tools创建的 IoT-Edge 解决方案。它生成一个 Dockerfile,该文件非常适合没有外部 DLL 作为依赖项的项目。

当我在这个模块 ( ) 中添加多个 DLL ( MySqlAdapter, BaseAdapter, ) 时,问题就出现了,而在尝试构建镜像时没有更改 Dockerfile,HelperMyEdgeModule

它抛出一个错误:

正在跳过项目“/MySqlAdapter/MySqlAdapter.csproj”,因为找不到它。正在跳过项目“/MySqlAdapter/MySqlAdapter.csproj”,因为找不到它。

...

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

这是生成的 DockerfileMyEdgeModule

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"]
Run Code Online (Sandbox Code Playgroud)

这些类库项目位于 Dockerfile 中的“../{projname}/*.csproj”。

因此,我尝试将这些项目分别添加到 Dockerfile 中,看看是否能正常工作,但没有成功。

我什至从文档中了解到这一点:

该路径必须位于构建的上下文内;你不能 COPY ../something /something,因为 docker 构建的第一步是将上下文目录(和子目录)发送到 docker 守护进程。

据我了解, mycontext是我尝试返回的文件夹,以找到我的依赖项项目,这似乎是不可能的。

假设该项目有数十个外部 DLL 作为依赖项,如何为该项目创建映像?

gne*_*ric 5

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

为了工作,需要将 Dockerfile 移动到解决方案目录,而不是生成它的项目文件夹。