今天在.Netcore项目里增加了图片验证码功能,在windows部署下未发现问题,但是在Linux(Centos)下部署却出现了如下问题
查了下是因为用了System.Drawing.Common类库需要在linux下安装一下libgdiplus来支持图像处理,图片处理,因为我的环境是在Docker环境下,所以去要在容器中增加一下
我们在构建的Dockerfile里面增加阿里源以及增加libgdiplus,具体如下
FROM mcr.microsoft.com/dotnet/sdk:5.0
RUN ln -s /lib/x86_64-linux-gnu/libdl-2.24.so /lib/x86_64-linux-gnu/libdl.so
RUN echo "deb http://mirrors.aliyun.com/debian wheezy main contrib non-free deb-src http://mirrors.aliyun.com/debian wheezy main contrib non-free deb http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free deb-src http://mirrors.aliyun.com/debian wheezy-updates main contrib non-free deb http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free deb-src http://mirrors.aliyun.com/debian-security wheezy/updates main contrib non-free" > /etc/apt/sources.list
RUN apt-get update
RUN apt-get install libgdiplus -y && ln -s libgdiplus.so gdiplus.dll
COPY . /publish
WORKDIR /publish
EXPOSE 8801
CMD ["dotnet", "Test.dll", "--urls", "http://*:8801"]
然后我们执行一下,出现了以下问题
Step 4/9 : RUN apt-get update
---> Running in 9b0f24c74c80
Ign:1 http://mirrors.aliyun.com/debian wheezy InRelease
Err:2 http://mirrors.aliyun.com/debian wheezy Release
404 Not Found [IP: 111.160.44.225 80]
Reading package lists...
E: The repository ‘http://mirrors.aliyun.com/debian wheezy Release‘ does not have a Release file.
The command ‘/bin/sh -c apt-get update‘ returned a non-zero code: 100
Unable to find image ‘ladder/devtools:latest‘ locally
docker: Error response from daemon: pull access denied for ladder/devtools, repository does not exist or may require ‘docker login‘: denied: requested access to the resource is denied.
See ‘docker run --help‘.
看了下是说好像是说镜像的问题
查了一下说是wheezy为debian(Linux发行版)的以前版本,因为Asp.Net Core5.0的docker镜像就是基于debian系统构建的,debian每个版本都有相对应的名字
- 5是Debian
- 6是squeeze
- 7是wheezy
- 8是jessie
- 9是stretch
那我们把镜像的系统改为最新的stretch,dockerfile如下
FROM mcr.microsoft.com/dotnet/sdk:5.0
RUN ln -s /lib/x86_64-linux-gnu/libdl-2.24.so /lib/x86_64-linux-gnu/libdl.so
RUN echo "deb http://mirrors.aliyun.com/debian stretch main contrib non-free deb-src http://mirrors.aliyun.com/debian stretch main contrib non-free deb http://mirrors.aliyun.com/debian stretch-updates main contrib non-free deb-src http://mirrors.aliyun.com/debian stretch-updates main contrib non-free deb http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free deb-src http://mirrors.aliyun.com/debian-security stretch/updates main contrib non-free deb http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib deb-src http://mirrors.aliyun.com/debian/ stretch-backports main non-free contrib" > /etc/apt/sources.list
# RUN apt-get update
# RUN apt-get install -y --allow-unauthenticated libgdiplus libc6-dev libgdiplus libx11-dev && ln -s libgdiplus.so gdiplus.dll
# RUN rm -rf /var/lib/apt/lists/*
RUN apt-get update
RUN apt-get install libgdiplus -y && ln -s libgdiplus.so gdiplus.dll
COPY . /publish
WORKDIR /publish
EXPOSE 8801
CMD ["dotnet", "DevTools.dll", "--urls", "http://*:8801"]
可以看到已经成功启动,再看下验证码
已经成功识别了,因为我的图片不涉及中文,有中文的问题可以查看其他文章
centos下.Netcore的docker容器部署出现“The type initializer for 'Gdip' threw an exception.”