Linux/Docker 中使用 System.Drawing.Common 踩坑小计
前言
在项目迁移到 .net core 上面后,我们可以使用 System.Drawing.Common 组件来操作 Image,Bitmap 类型,实现生成验证码、二维码,图片操作等功能。System.Drawing.Common 组件它是依赖于 GDI+ 的,然后在 Linux 上并没有 GDI+,面向谷歌编程之后发现,Mono 团队使用 C语言 实现了GDI+ 接口,提供对非Windows系统的 GDI+ 接口访问能力,这个应该就是libgdiplus。所以想让代码在 linux 上稳定运行有关 System.Drawing.Common 的代码的时候,必须安装组件libgdiplus。而现在大多是 docker 进行发布,如果快速简单的安装 libgdiplus?
安装 libgdiplus
方案一
基于微软提供的 mcr.microsoft.com/dotnet/core/aspnet:3.1 重新构建一个带libgdiplus 的镜像,但是带来的问题是,将来版本更新了,都得重新构建一遍。当然写脚本自动构建,那就没问题了。哈哈
方案二
这也是我目前采用的,构建应用镜像的时候安装 libgdiplus,但是因为系统镜像源是国外,导致安装 libgdiplus 十分缓慢,不忍直视。我们把系统包源地址修改成阿里云包源地址,问题就迎刃而解了。 参考 Dockerfile 如下:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN apt-get update -y && apt-get install -y libgdiplus && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
ARG PROJECT
WORKDIR /app
...
替换包源地址,注意哦,官方镜像使用的是 debian 而不是 ubuntu 的源,一开始我一直以为 ubuntu 搞半天没成功。
sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
番外:缺少中文字体咋办呢?好办
除了遭遇以上问题外,还遇到了字体缺失,导致的生成图片中有关中文字体全部是乱码的情况,这里的中文是指我们通过程序自己画上去的。对于这个问题嘛?缺啥补啥呗,缺字体补字体。基于上面的 Dockerfile 调整:
FROM mcr.microsoft.com/dotnet/core/aspnet:3.1
RUN sed -i "s@http://deb.debian.org@http://mirrors.aliyun.com@g" /etc/apt/sources.list
RUN apt-get update -y && apt-get install -y libgdiplus locales fontconfig && apt-get clean && ln -s /usr/lib/libgdiplus.so /usr/lib/gdiplus.dll
RUN sed -ie 's/# zh_CN.UTF-8 UTF-8/zh_CN.UTF-8 UTF-8/g' /etc/locale.gen && locale-gen && mkdir /usr/share/fonts/truetype/deng/
ADD ./fonts/* /usr/share/fonts/truetype/deng/
RUN fc-cache -vf && fc-list
ENV LANG zh_CN.UTF-8
ARG PROJECT
WORKDIR /app
...
- 原文地址:链接 本文收录在个人博客 https://gridea.run,欢迎来踩
Linux/Docker 中使用 System.Drawing.Common 踩坑小计的更多相关文章
- 在linux 或docker中使用 system.drawing.common
在dockerfile 中添加 FROM microsoft/dotnet:2.1-aspnetcore-runtime RUN apt-get update RUN apt-get install ...
- asp.net core 2.1 容器中使用 System.Drawing.Common 的问题
- 关于.net core 在docker中监听地址设置踩坑记
1.今天在做docker容器的时候发现如果将.net core 内部监听地址设置为localhost:8888. 2.在docker build -p 6444:8888 运行容器后,外部通过6444 ...
- ReactNative 踩坑小计
使用ES6語法編寫Component時綁定事件需要用this.MethodName.bind(this),否則MethodName中無法使用this <TouchableHighlight on ...
- flutter 踩坑小计: amap_base 地图缩放 zoom 设置无效的问题
这种问题估计也就我这种菜鸡能遇到了,因为我问了一些大佬,他们完全没遇到这类的问题. 如果你也遇到了,希望这篇文章能帮到你,倘若还不能解决你的问题,可以留言,我们共同研究. 问题:同样的插件,为什么偏偏 ...
- .NET Core System.Drawing.Common 中文乱码的坑
最近在写一个汉字取点阵的程序,最开始是在win环境下运行的,没发现什么异常,然后今天把程序放在centos 下后发现英文正常,中文完全变成两位的字了,最开始是字体的原因 在把宋体等安装到centos ...
- Asp.Net Core使用System.Drawing.Common部署到docker报错问题
Asp.Net Core 2.1发布后,正式支持System.Drawing.Common绘图了,可以用来做一些图片验证码之类的功能.但是把网站部署到docker容器里运行会遇到很多问题,也是非常闹心 ...
- [译]如何在.NET Core中使用System.Drawing?
你大概知道System.Drawing,它是一个执行图形相关任务的流行的API,同时它也不属于.NET Core的一部分.最初是把.NET Core作为云端框架设计的,它不包含非云端相关API.另一方 ...
- .netcore中无法使用System.Drawing --解决方案
问题重现: 无法正常使用 解决方法: 安装System.Drawing.Common的NuGet就能正常使用了 操作之后: 这个是.netcoe中的解决办法,.net framework解决方案中添 ...
随机推荐
- Java架构师如何学习?
引言 古人云:"活到老,学到老."互联网算是最辛苦的行业之一,"加班"对工程师来说已是"家常便饭",同时互联网技术又日新月异,很多工程师都疲 ...
- 5、struct2的支持ModelDriver获得参数
1.在以前的代码中我们我们需要获得jsp传递过来的参数我们采用下面的方式获得 package com.weiyuan.test; /** * struct2的action可以不继承任何框架的接口 * ...
- CI CD概念
CI:持续集成 Continuous Integration CD:持续发布 Continuous Delivery (完)
- java语言基础(二)_IDEA_方法
IDEA使用 项目结构: 所有代码放置在src文件夹内 新建包:在src文件夹上,右键新建包.包的命名:英文小写.数字.英文句点. 例如:使用公司域名倒写,如cn.itcast.day04.demo0 ...
- springmvc json乱码问题
在方法上加上:produces属性即可 @RequestMapping(produces = "application/json;charset=utf-8")
- tbody滚动条占位导致与thead表头错位
tbody出滚动条导致表头错位,上网上搜了一下,发现全是答非所问,能隐藏滚动条,还用问??我当前作出的效果是当tbody内容在正常情况下显示时,不显示滚动条,当内容区域高度超过外部容器时,滚动条自动显 ...
- 状压DP之吃奶酪
题目 传送们 思路 1≤n≤15,妥妥的状压,数据这么小, 这道题的状压思路还是很好想的,我们定义f[i][s]代表以i为起点,吃掉状态为s的奶酪所需要跑的最短距离,那么显然,我们先枚举状态s,然后枚 ...
- 用python执行rails项目sidekiq任务
我们先看一下如何ruby如何推一个任务到sidekiq https://github.com/mperham/sidekiq/wiki/FAQ#how-do-i-push-a-job-to-sidek ...
- JAVASE经典面试问题(必须熟背),你Get到了吗?
JAVASE经典面试问题(必须熟背) 1. 编译java程序使用什么命令?运行java使用什么命令? javac *.java java 类名 2. 什么是JDK,什么是JRE,JDK与JRE有什么区 ...
- day19 生成器+函数递归
目录 一.yield表达式 1 yield表达式基本用法 二.三元表达式 三.生成式 1 列表生成式 2 字典生成式 3 集合生成式 4 生成器表达式 四.函数的递归 1 递归的定义 2 详解递归 前 ...