Docker实用技巧之更改软件包源提升构建速度
本文在原文的基础上做了一些修改和补充,有问题的地方欢迎指出
原文链接: https://www.cnblogs.com/stulzq/p/9339250.html
一. 问题说明
我的一个开源项目提供了在线示例,项目代码在github,提交代码以后通过Jenkins持续集成,以Docker的方式运行。大家用过.NET Core的人应该都知道,.NET Core 默认是不带 System.Drawing的,前期有第三方的实现,为我们提供了一个解决方案,现在官方也提供了一个,以nuget包的方式发布,名为 System.Drawing.Common
,实用这个包可以正常的进行各种图片操作,比如生成图片验证码,二维码等等,但是如果我们将其发布到linux,将会出现异常:Unable to load DLL 'libgdiplus'
。解决办法是,我们在构建Docker镜像的时候,可以通过命令装上libgdiplus
,但是如果直接写命令apt-get install -y libgdiplus
,你会发现构建会出错,找不到这个包,我们需要在执行这个命令之前,执行apt-get update
更新软件包源,那么问题来了,我在第一次构建Docker镜像(没有使用Cache)的执行 apt-get update
命令时,非常的慢。最后整个构建过程花了12分钟。
构建的程序为 ASP.NET Core 2.1 应用程序,使用的基础镜像为微软官方提供的:microsoft/dotnet:2.1-aspnetcore-runtime
这不能忍啊,简直是太慢了,查看日志,发现这里执行非常慢:
1 | After this operation, 38.8 MB of additional disk space will be used. |
应该是从 http://cdn-fastly.deb.debian.org/debian
获取数据太慢导致的,所以,准备替换构建所使用的基础镜像的软件包源,准备替换为网易提供的包源 http://mirrors.163.com/
二.问题解决–替换软件包源
软件包源的配置文件在基础镜像所用的Linux系统中路径为 /etc/apt/sources.list
,我们只需在执行 apt-get update
命令之前,将我们编写好的使用网易包源的配置文件进行替换就行了。
使用网易包源的配置文件:
sources.list
1 | deb http://mirrors.163.com/debian/ jessie main non-free contrib |
那么有一个问题,初始的时候docker的linux连vim都没有, 怎么更改文件的中内容呢???
换个思路,不更改文件了
mv /etc/apt/sources.list /etc/apt/sources.list.bak
将原来的源文件拷贝一份
找到适合自己容器中linux的版本, 然后去阿里源找相应的替换源, 比如我的docker的linux版本是deblian,
使用echo 命令
1
2
3
4
5
6
7
8
9echo "deb http://mirrors.163.com/debian/ jessie main non-free contrib
deb http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-updates main non-free contrib
deb-src http://mirrors.163.com/debian/ jessie-backports main non-free contrib
deb http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib
deb-src http://mirrors.163.com/debian-security/ jessie/updates main non-free contrib" > sources.list
mv sources.list /etc/apt/sources.list重启一下容器, 然后apt-get update 一下,
哈哈哈哈哈哈哈, 这速度,安装软件开心到飞起😁😘
Dockerfile:
1 | FROM microsoft/dotnet:2.1-aspnetcore-runtime |
主要是这两句命令:
1 | #备份旧的配置文件 |
需要注意的是,sources.list 需要放在我们打包的目录,保证能复制到镜像里面。
然后构建时间由12分钟缩短到37秒,这个过程是没有使用Docker Cache所花的时间:
三.其他加速
1.腾讯云
我的服务器是使用的腾讯云,腾讯云也提供了软件包源,分为内网和外网,外网是所有人都能使用,内网只能腾讯云的服务器使用。使用内网的包源将会获得更快的速度。详细说明:https://cloud.tencent.com/document/product/213/8623
使用内网的腾讯云包源配置文件:
1 | deb http://mirrors.tencentyun.com/debian/ jessie main non-free contrib |
2.阿里云
阿里云作为一个全球第三的云平台运营商,也是具有此项服务的。其包源地址为:https://mirrors.aliyun.com
配置文件:
1 | deb https://mirrors.aliyun.com/debian/ jessie main non-free contrib |
四.其他Linux系统镜像
我用的Docker镜像所使用的Linux系统为 debian,如果你是用的不是 debian,那么你可以通过以下几个步骤来进行包源的更改。
方法一
1.通过你所使用镜像官方提供的资料,查询出镜像所使用的Linux系统包源路径以及配置文件内容
2.替换加速地址
方法二
1.使用你需要使用的镜像构建一个简单的程序,然后运行。
2.通过Docker交互模式,进入容器。
3.查询出使用的系统Linux镜像版本
4.找到并查看包源配置文件
5.复制配置文件内容,然后将地址替换为对应的加速地址