树莓派上在Docker中跑.Net Core
运行和开发环境
运行环境:树莓派3b,raspbian系统,已经安装Docker 。
开发环境:windows 10系统,vs 2019
测试代码编写
vs2019新建了一个名为RaspBianDockerDemo的DotNetCore 3.1控制台程序,并添加Docker支持。
Dockerfile的配置
使用Dockerfile多阶段构建.Net Core应用镜像
平常情况下,Dockerfile的内容是这样的
#FROM 是指定 基础镜像,因此一个 Dockerfile 中 FROM 是必备的指令,并且必须是第一条指令。
#每一条 FROM 指令都是一个构建阶段,多条 FROM 就是多阶段构建,虽然最后生成的镜像只能是最后一个阶段的结果,但是,能够将前置阶段中的文件拷贝到后边的阶段中,这就是多阶段构建的最大意义。
#AS 是将编译阶段命名为 base
#runtime仅包含某个.NET实现版本的程序集格式、API、功能兼容性等的描述信息库。仅能运行程序,用以缩小镜像文件的大小。
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim AS base
#使用 WORKDIR 指令可以来指定工作目录(或者称为当前目录),以后各层的当前目录就被改为指定的目录,如该目录不存在,WORKDIR 会帮你建立目录。
WORKDIR /app
#SDK包含相应.NET实现的全套运行时、MSBuild等生成工具、编译器等开发所需的一切,包含目标包。
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
#COPY <源路径>... <目标路径> COPY指令将从构建上下文目录中 <源路径> 的文件/目录复制到新的一层的镜像内的 <目标路径> 位置
COPY ["RaspBianDockerDemo/RaspBianDockerDemo.csproj", "RaspBianDockerDemo/"]
#RUN 指令是用来执行命令行命令的。由于命令行的强大能力,RUN 指令在定制镜像时是最常用的指令之一。dotnet restore 是.NET Core CLI的一个基本命令,功能是使用 NuGet 还原依赖项以及在 project 文件中指定的特定于项目的工具。
RUN dotnet restore "RaspBianDockerDemo/RaspBianDockerDemo.csproj"
#将本地计算机的当前工作目录复制到容器的当前工作目录中。
COPY . .
WORKDIR "/src/RaspBianDockerDemo"
#dotnet build 是.NET Core CLI的一个基本命令,功能是将项目及其依赖项生成为一组二进制文件。 二进制文件包括扩展名为 .dll 的中间语言 (IL) 文件中的项目代码。
RUN dotnet build "RaspBianDockerDemo.csproj" -c Release -o /app/build
FROM build AS publish
#dotnet publish 是.NET Core CLI的一个基本命令,功能是编译应用程序、读取 project 文件中指定的所有依赖项并将生成的文件集发布到目录。
RUN dotnet publish "RaspBianDockerDemo.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
#COPY 指令的 --from=publish参数,功能是从前边的publish阶段中拷贝文件到当前阶段中
COPY --from=publish /app/publish .
# 指定容器运行时入口程序
ENTRYPOINT ["dotnet", "RaspBianDockerDemo.dll"]
但是树莓派是arm32位的,运行上面Dockerfile构建镜像会提示错误
exec user process caused "exec format error"
通过hub docker上查找了.net core的资料(链接),需要改成Linux arm32 Tags
Dockerfile内容如下
FROM mcr.microsoft.com/dotnet/core/runtime:3.1-buster-slim-arm32v7 AS base //第一处修改 将3.1-buster-slim 改成 3.1-buster-slim-arm32v7
WORKDIR /app
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["RaspBianDockerDemo/RaspBianDockerDemo.csproj", "RaspBianDockerDemo/"]
RUN dotnet restore "RaspBianDockerDemo/RaspBianDockerDemo.csproj"
COPY . .
WORKDIR "/src/RaspBianDockerDemo"
RUN dotnet build "RaspBianDockerDemo.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "RaspBianDockerDemo.csproj" -c Release -r debian-arm -o /app/publish //第二处修改 增加 -r debian-arm
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "RaspBianDockerDemo.dll"]
生成发布,在树莓派成功运行。