一个计算机技术爱好者与学习者

0%

Alpine入门篇

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
# 更新最新本地镜像源
apk update

# 升级软件
apk upgrade

# 指定升级部分软件包
apk add --upgrade xxx

# 安装包
apk add xxx

# 搜索包,支持正则
apk search xxx
apk search -v 'xx*'
apk search -v -d 'xxx'

# 查看包详细信息
apk info -a xxx

# 查看包列表
apk show

# 卸载并删除包
apk del xxx

使用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
2
apk add --no-cache build-base
apk info -a build-base

4. 修改时区

Alpine修改时区,主要参考修改使用Alpine Linux的Docker容器的时区

1、下载apline镜像

1
docker pull alpine:3.7.3

2、启动apline容器&登录进入容器

1
2
docker run -d --name alpine_timezone alpine:3.7.3 sleep 3000
docker exec -it alpine_timezone /bin/sh

3、安装timezone

1
2
apk add -U tzdata
ls /usr/share/zoneinfo

4、拷贝需要的时区文件到localtime

1
cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime

5、验证时区

1
date

6、精简镜像

1
apk del tzdata

7、保存镜像

1
2
3
4
exit
docker commit alpine_timezone voidking/alpine:v1.0
docker login
docker push

以上,完成了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
2
3
4
5
6
7
8
9
10
  unable to execute 'gcc': No such file or directory
error: command 'gcc' failed with exit status 1
----------------------------------------
ERROR: Failed building wheel for cffi
Running setup.py clean for cffi
Failed to build cffi
Installing collected packages: pycparser, wheel, setuptools, cffi
Running setup.py install for cffi: started
Running setup.py install for cffi: finished with status 'error'
ERROR: Command errored out with exit status 1:

原因:从bcrypt文档可知,bcrypt有一些依赖需要提前安装

解决办法:安装gcc依赖

1
apk add --update musl-dev gcc cargo

再次安装bcrypt==3.2.2,报错:

1
2
3
  ERROR: Failed building wheel for cffi
Running setup.py clean for cffi
Failed to build cffi

解决办法:安装libffi-dev

1
apk add libffi-dev

参考文档:

5.2. 软件包下载失败

apk add libffi-devel报错:

1
2
3
ERROR: unsatisfiable constraints:
libffi-devel (missing):
required by: world[libffi-devel]

这是因为软件仓库没有这个软件,可以在Alpine’s package search网站上搜索,看看包是否存在,叫什么名字。

这里可以搜索关键字libffi*,发现在alpine中,没有libffi-devel,只有libffi-dev,安装它即可。

参考文档How to resolve missing dependencies in Docker Alpine

  • 本文作者: 好好学习的郝
  • 原文链接: https://www.voidking.com/dev-alpine-start/
  • 版权声明: 本文采用 BY-NC-SA 许可协议,转载请注明出处!源站会即时更新知识点并修正错误,欢迎访问~
  • 微信公众号同步更新,欢迎关注~