最近在做 Alpine 中构建 Ceph 的需求,这里简单进行一下相关的记录。
首先创建容器,并指定相关的代理:
1 | $ docker pull alpine |
安装 sdk(其实就是 GCC 之类的,类似于 Ubuntu 下的 build-essential),并创建普通用户(创建非 root 用户不是必须的,不过我一般习惯使用非 root 用户):
1 | # apk add alpine-sdk |
安装必要的工具,比如 openssh 之类的是因为代码放在 gerrit 上面,需要 ssh 进行克隆:
1 | // no_proxy environment variable ignored by wget |
配置 git,用于从 gerrit 克隆代码(使用配置 core.sshCommand
的方式以 ssh 方式克隆代码要求 git 的版本为 2.10+,详情请参考 git clone ssh repo 时使用 http 代理):
1 | $ ssh-keygen |
将 SSH 公钥拷贝至 gerrit:
1 | $ cat ~/.ssh/id_rsa.pub |
克隆 Ceph 代码(基于社区 12.2.12 版本),并打上必要的 补丁(我的需求其实只是需要 Ceph 的客户端,因此我禁用了 RGW 等组件),apk 构建所需的 spec 文件主要参考了 Alpine 官方的 aports,然后根据 rpm 的 spec 对依赖等做了部分修改:
1 | $ patch -p1 < ../p1.diff |
最后执行 Ceph 源代码目录下的 make-apk.sh 脚本即可进行构建:
1 | $ ./make-apk.sh |
当然也可以自己写个脚本,将 apk 签名所需的密钥独立出来,这样公钥可以独立发布,而不是每次发布 apk 包都需要发布一个公钥。
如果需要在容器内使用 ceph-fuse,需要注意在创建容器时加上 --cap-add SYS_ADMIN --device /dev/fuse
的选项,否则会出现如下的错误:
1 | # lsmod | grep fuse |
参考资料
Alpine Developer Documentation
https://wiki.alpinelinux.org/wiki/Developer_Documentation
fuse: device not found, try ‘modprobe fuse’ first
https://github.com/s3fs-fuse/s3fs-fuse/issues/647#issuecomment-392697838