aspnetcore 2.1 发布到树莓派3linux的艰辛路程
发布至docker for windows.
提示:
image operating system "windows" cannot be used on this platform
解决:
网上查了,说是运行环境不对,要在win虚拟机上执行,都是把docker的环境切换成windows。
不过我们如果在创建项目的时候,选择docker文件是“linux”版本,就不需要windows版本,所以我们保持docker默认的linux版本,只需要确保新建项目时生成的DockerFile,不是基于windows就好。
由于是树莓派,这里准备把aspnetcore2.1项目,发布为 linux-arm 方式。
# 首先,定位到要发布的项目根目录,也就是csproj文件所在位置,按住shift键右击,选择在此处打开命令行/powershell,两个选项差不多这个看系统设定。 # 以 linux-arm 方式发布 dotnet publish -c Release -r linux-arm
之后,我们将目光放到树莓派上,我用的是三代,也就是ARMv7,所以core sdk是没法装的,只能使用runtime的方式,所以最简单的DockerFile如下:
# 添加基础镜像:docker会从网络下载这个镜像 FROM microsoft/dotnet:2.1-sdk-stretch-arm32v7 AS build MAINTAINER suntai #容器中系统的工作空间 WORKDIR /app #拷贝当前文件夹下的文件到容器中系统的工作空间(注意:“.”后面有空格) COPY . /app #设置程序要侦听的端口 EXPOSE 80 # 下面这里是dotnetcore runtimez执行方式 ENTRYPOINT ["./WebCoreHost"]
之后就可以通过树莓派开启ssl,用sftp从微软平台传文件到树莓派的linux平台了。当然要传输的目录就是刚才生成的目录,则你可能要拷贝的目录就是
bin\Release\netcoreapp2.1\linux-arm\publish\
先直接运行下试试,进入我们程序所在位置。
# 我们先把程序入口点设置为可运行,当然你可以设置权限为755,也可以用+x方式 sudo chmod +x ./WebCoreHost # 然后我们基于runtime执行 ./WebCoreHost # aspnetcore runtime会执行程序,如果什么都不管的话,是启用5000端口。
当然,之后如果你想结束程序测试,或者端口被占了,可以kill掉程序
# 显示占用端口的程序 sudo netstat -ltp # 结束指定程序,比如说程序标识是233 sudo kill 233
在树莓派上创建容器并运行程序,注意句点的位置,表示操作当前目录(linux docker for aspnetcore)
# 将当前目录添加到为docker镜像,起一个别名叫做aspnetapp。
docker build -t aspnetapp .
# 以关闭后自动销毁的方式,启动一个容器,侦听外部的8000端口,并转发至程序内部的80端口 docker run --rm -it -p 8000:80 aspnetapp
提升当前操作用户操作Docker的权限,不需要sudo,也能解决 permission denied
# 如果还没有 docker group 就添加一个 sudo groupadd docker # 将用户加入该 group 内。然后退出并重新登录就生效啦 sudo gpasswd -a ${USER} docker # 重启 docker 服务 sudo service docker restart # 切换当前会话到新 group 或者重启 X 会话 newgrp - docker
常用的Docker容器和镜像操作
# 停用全部正在运行的容器 docker stop $(docker ps -q) # 删除全部容器 docker rm $(docker ps -aq) # 一条命令实现停用并删除容器 docker stop $(docker ps -q) & docker rm $(docker ps -aq) # 删除所有镜像 docker rmi $(docker images -q) # 停止并删除none镜像 docker stop $(docker ps -a | grep "Exited" | awk '{print $1 }') docker rm $(docker ps -a | grep "Exited" | awk '{print $1 }')