Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署
之前我写过一篇使用 docker 部署 AspNetCore 应用的文章,这种方式搭配 CICD 非常方便, build 之后 push 到私有的 dockerhub ,在生产服务器上 pull 下来镜像就可以直接运行了。 然而,有时需要一种更传统的部署方式,比如在本地打包可执行文件之后直接放到服务器上执行。 这种方式配置完成之后,每次更新只需要重新本地重新 publish 后把可执行文件上传
目录7 个章节
前言
之前我写过一篇使用 docker 部署 AspNetCore 应用的文章,这种方式搭配 CICD 非常方便, build 之后 push 到私有的 dockerhub ,在生产服务器上 pull 下来镜像就可以直接运行了。
然而,有时需要一种更传统的部署方式,比如在本地打包可执行文件之后直接放到服务器上执行。
.NetCore 打包可执行文件有两种方式
- 独立可执行文件 - 不依赖任何运行时环境,直接执行就可以启动
- 框架依赖 - 需要先安装对应版本的 dotnet-runtime 才可以运行
前者虽然方便,但打包出来比较大,据说在 .net8 版本会有优化,但后面的事后面再说,本文记录第二种方式,框架依赖,搭配 docker 部署,这样就无需在服务器上安装 runtime 了。
(PS:有点Java部署内味了)
这种方式配置完成之后,每次更新只需要重新本地重新 publish 后把可执行文件上传覆盖服务器上的版本即可,非常方便~
不生成 PDB
每次打包会生成一堆 pdb 调试文件,但部署的时候我们不需要这些文件,可以通过配置 .csproj 文件关闭。
<PropertyGroup Condition="'$(Configuration)|$(Platform)'=='Release|AnyCPU'">
<DebugType>none</DebugType>
<DebugSymbols>false</DebugSymbols>
</PropertyGroup>
更好的方式是在解决方案的目录下创建 common.props 文件,把以上配置放在这个文件中,然后每个 .csproj 都引用这个文件,具体路径根据实际情况而定。
<Import Project="../../common.props" />
打包
使用以下命令打包
dotnet publish -f net7.0 -c Release -p:PublishSingleFile=true
打包之后生成一个需要依赖 runtime 运行的可执行文件,接下来准备一下 docker 的配置。
dockerfile
官方的 dockerfile 包含从源码构建到部署的整个流程,我们这里只需要 base 和 final ,也就是把可执行文件放进去微软的基础镜像里运行。
FROM mcr.microsoft.com/dotnet/aspnet:7.0 AS base
WORKDIR /app
EXPOSE 80
EXPOSE 443
FROM base AS final
WORKDIR /app
COPY . .
ENTRYPOINT ["./AIHub.Blazor"]
docker-compose
不想每次都打一堆 docker 的命令,或者不想写 bash 脚本的话,docker-compose 是最好的选择,还可以很方便的和其他容器编排使用。
version: '3.6'
services:
web:
image: ${DOCKER_REGISTRY-}web
container_name: aihub
restart: always
environment:
- ASPNETCORE_ENVIRONMENT=Production
- ASPNETCORE_URLS=http://+:80
build:
context: .
volumes:
- .:/app
ports:
- "12001:80"
networks:
- default
- swag
networks:
swag:
name: swag
external: true
default:
name: aihub
补充:
ports节点映射了容器内的 80 端口- 我使用了 swag 来提供 web 服务,所以其实不需要使用
ports映射端口 - 后续再试用 candy / traefik 来替代 nginx (本项目没有nginx,直接用 kestrel)
启动!
使用命令行启动!
docker compose up
如果没有映射端口的话,还需要接着配置一下反向代理。
swag配置
直接上配置
/path/to/swag/config/nginx/proxy-confs/aihub.subdomain.conf
server {
listen 443 ssl;
listen [::]:443 ssl;
server_name aihub.*;
include /config/nginx/ssl.conf;
client_max_body_size 0;
# enable for ldap auth, fill in ldap details in ldap.conf
#include /config/nginx/ldap.conf;
# enable for Authelia
#include /config/nginx/authelia-server.conf;
location / {
# enable the next two lines for http auth
#auth_basic "Restricted";
#auth_basic_user_file /config/nginx/.htpasswd;
# enable the next two lines for ldap auth
#auth_request /auth;
#error_page 401 =200 /ldaplogin;
# enable for Authelia
#include /config/nginx/authelia-location.conf;
include /config/nginx/proxy.conf;
include /config/nginx/resolver.conf;
set $upstream_app aihub;
set $upstream_port 80;
set $upstream_proto http;
proxy_pass $upstream_proto://$upstream_app:$upstream_port;
proxy_hide_header X-Frame-Options; # Possibly not needed after Portainer 1.20.0
}
}
_EOF_
Asp-Net-Core开发笔记:FrameworkDependent搭配docker部署
- 本文作者:
- 程序设计实验室
- 版权声明:
- 本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!
相关文章
Asp-Net-Core开发笔记:快速在已有项目中引入EFCore
很多项目一开始选型的时候没有选择EFCore,不过EFCore确实好用,也许由于种种原因后面还是需要用到,这时候引入EFCore也很方便。 本文以 StarBlog 为例,StarBlog 目前使用的 ORM 是 FreeSQL ,引入 EFCore 对我来说最大的好处是支持多个数据库,如果是 FreeSQL 的话,服务注册的时候是单例模式,只能连接一个数据库,如果需要使用 FreeSQL 同时
2023-10-08 · Asp-Net-Core开发笔记 · 约 1 分钟
Asp-Net-Core开发笔记:使用ActionFilterAttribute实现非侵入式的参数校验
用ActionFilterAttribute搞非侵入校验,省得重复写代码。支持Query、Body、Route、Header,HttpContext共享数据,但OAuth2.0边学边做,项目乱糟糟,功能凑合。
2024-05-17 · Asp-Net-Core开发笔记 · 约 1 分钟
Asp-Net-Core开发笔记:给SwaggerUI加上登录保护功能
既要在项目发布后访问 SwaggerUI ,又要保证一定的安全性,本文提供的思路或许是一种比较简单又有效的解决方案。
2024-05-21 · Asp-Net-Core开发笔记 · 约 1 分钟
Asp-Net-Core开发笔记:集成Hangfire实现异步任务队列和定时任务
前言 最近把Python写的数据采集平台往.Net Core上迁移,原本的采集任务使用多进程+线程池的方式来加快采集速度,使用Celery作为异步任务队列兼具定时任务功能,这套东西用着还行,但反正就折腾嘛,直接上C#~ 本文记录 Hangfire 在实际应用里的用法,我发现网络上找到的大部分文章都是用 Hangfire 的异步任务输出个 Hello World,然后就没了。我实在不知道这样的文章写
2023-03-09 · Asp-Net-Core开发笔记 · 约 1 分钟
讨论
共 0 条加载评论中…