1. Alpine简介
Alpine Linux是基于musl libc和 busybox 的面向安全的轻量级Linux发行版。
Alpine的VM镜像大小113M,Alpine的Docker镜像大小只有2M!
Alpine由非商业组织维护的,支持广泛场景的Linux发行版,它特别为资深/重度Linux用户而优化,关注安全,性能和资源效能。
Alpine 镜像可以适用于更多常用场景,并且是一个优秀的可以适用于生产的基础系统/环境。
第一次接触alpine,是使用它跑单测。gitlab设置代码提交后触发单测,而这个单测,可以使用alpine来进行。但是因为时区问题,跑出的单测结果和预期不同。因此,本文以修改Alpine时区为引子,简单学习了解一下Alpine。
PS:与Alpine相似的一个小系统CirrOS的VM镜像大小只有12M,CirrOS的Docker镜像大小只有10M。
2. Alpine包管理
Alpine采用了 musl libc 和 busybox 以减小系统的体积和运行时资源消耗,但功能上比 busybox 又完善的多,因此得到开源社区越来越多的青睐。
在保持瘦身的同时,Alpine还提供了自己的包管理工具apk。参考文档:
常用命令:
1 | # 更新最新本地镜像源 |
使用apk add命令时,往往下载缓慢或者下载失败。参考清华大学Alpine镜像使用帮助,修改镜像源。
1 | sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories |
3. 编译依赖包build-base
build-base里面包含gcc、libc、make、g++
1 | apk add --no-cache build-base |
4. 修改时区
Alpine修改时区,主要参考修改使用Alpine Linux的Docker容器的时区。
1、下载apline镜像
1 | docker pull alpine:3.7.3 |
2、启动apline容器&登录进入容器
1 | docker run -d --name alpine_timezone alpine:3.7.3 sleep 3000 |
3、安装timezone
1 | apk add -U tzdata |
4、拷贝需要的时区文件到localtime
1 | cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime |
5、验证时区
1 | date |
6、精简镜像
1 | apk del tzdata |
7、保存镜像
1 | exit |
以上,完成了Alpine镜像时区的修改。
此外,还有一种更简单的方法,在启动Alpine容器时映射宿主机的时区文件。
1 | docker run --name alpine -it -d -v /etc/localtime:/etc/localtime alpine:3.7.3 |
或者更简单一些,使用Dockerfile构建新镜像,把宿主机/etc/localtime
拷贝到alpine镜像中。
5. 问题排查
5.1. pip包安装失败
python:3.8.8-alpine3.12 中,安装python包bcrypt==3.2.2,报错:
1 | unable to execute 'gcc': No such file or directory |
原因:从bcrypt文档可知,bcrypt有一些依赖需要提前安装
解决办法:安装gcc依赖
1 | apk add --update musl-dev gcc cargo |
再次安装bcrypt==3.2.2,报错:
1 | ERROR: Failed building wheel for cffi |
解决办法:安装libffi-dev
1 | apk add libffi-dev |
参考文档:
5.2. 软件包下载失败
apk add libffi-devel
报错:
1 | ERROR: unsatisfiable constraints: |
这是因为软件仓库没有这个软件,可以在Alpine’s package search网站上搜索,看看包是否存在,叫什么名字。
这里可以搜索关键字libffi*
,发现在alpine中,没有libffi-devel,只有libffi-dev,安装它即可。