1、 樹莓派安裝Docker
$ curl -fsSL https://get.docker.com -o get-docker.sh $ sudo sh get-docker.sh
2、 在Visual Studio創建測試項目
3、 生成項目鏡像。這部分坑比較多,需要多注意一下,我也會把步驟拆分的更細。
項目創建后VS會在項目目錄下自動生成Docker鏡像的描述文件Dockerfile,但是如果我們直接使用這個文件生成鏡像就會提示下面的錯誤。
這是因為下面標黃的部分路徑錯誤導致的,需要把前面標紅的目錄部分刪掉就可以了。
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging.
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build
WORKDIR /src
COPY ["RaspberryDockerDemo/RaspberryDockerDemo.csproj", "RaspberryDockerDemo/"]
RUN dotnet restore "RaspberryDockerDemo/RaspberryDockerDemo.csproj"
COPY . .
WORKDIR "/src/RaspberryDockerDemo"
RUN dotnet build "RaspberryDockerDemo.csproj" -c Release -o /app/build
FROM build AS publish
RUN dotnet publish "RaspberryDockerDemo.csproj" -c Release -o /app/publish
FROM base AS final
WORKDIR /app
COPY --from=publish /app/publish .
ENTRYPOINT ["dotnet", "RaspberryDockerDemo.dll"]
再次執行生成命令,你會發現又出錯了 -_-!
根據錯誤提示我們注意到是沒找到入口的靜態main方法,事實上這個方法是有的,問題出在以下標黃的COPY命令部分,路徑又錯了,我們加上子目錄修改為正確的路徑。
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1-buster-slim AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["RaspberryDockerDemo.csproj", "RaspberryDockerDemo/"] RUN dotnet restore "RaspberryDockerDemo/RaspberryDockerDemo.csproj"
COPY . ./RaspberryDockerDemo
WORKDIR "/src/RaspberryDockerDemo" RUN dotnet build "RaspberryDockerDemo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "RaspberryDockerDemo.csproj" -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "RaspberryDockerDemo.dll"]
經過各種路徑問題,我們終於成功生成了鏡像。
使用docker ps命令我們可以看到我們剛生成的鏡像
后來我發現這個鏡像部署到樹莓派無法啟動,會提示如下錯誤
exec user process caused "exec format error"
這是因為樹莓派是基於ARM的CPU架構的,我們的開發機是普通的x86/64平台,導致生成的鏡像無法在ARM平台啟動,我們需要把Dockerfile中的配置修改為arm使用的環境。
同時也需要修改publish命令,增加-r參數來指定應用程序的目標平台為debian-arm。
-r參數說明參見文檔 https://docs.microsoft.com/zh-cn/dotnet/core/rid-catalog, https://github.com/dotnet/runtime/blob/master/src/libraries/pkg/Microsoft.NETCore.Platforms/runtime.json
修改后最終的文件如下:
#See https://aka.ms/containerfastmode to understand how Visual Studio uses this Dockerfile to build your images for faster debugging. FROM mcr.microsoft.com/dotnet/core/aspnet:3.1.3-buster-slim-arm32v7 AS base WORKDIR /app EXPOSE 80 EXPOSE 443 FROM mcr.microsoft.com/dotnet/core/sdk:3.1-buster AS build WORKDIR /src COPY ["RaspberryDockerDemo.csproj", "RaspberryDockerDemo/"] RUN dotnet restore "RaspberryDockerDemo/RaspberryDockerDemo.csproj" COPY . ./RaspberryDockerDemo WORKDIR "/src/RaspberryDockerDemo" RUN dotnet build "RaspberryDockerDemo.csproj" -c Release -o /app/build FROM build AS publish RUN dotnet publish "RaspberryDockerDemo.csproj" -r debian-arm -c Release -o /app/publish FROM base AS final WORKDIR /app COPY --from=publish /app/publish . ENTRYPOINT ["dotnet", "RaspberryDockerDemo.dll"]
接下就很簡單了,我們再次運行docker build命令生成鏡像,直接用docker save命令把鏡像導出到本地
docker save -o e:/raspdockerdemo.tar rasp/raspdockerdemo:v1
4、 部署鏡像到樹莓派
上傳文件到樹莓派,我使用的是WinSCP上傳的。然后使用 docker load命令導入我們的鏡像。
現在就可以使用docker run命令來啟動我們的鏡像了。
使用docker ps命令可以看到我們的鏡像已經成功在docker上跑起來了。
使用瀏覽器訪問 http://樹莓派IP:7000,就可以看到我們的測試項目已經可以訪問了。