Alpine与glibc

Alpine官方对这个问题的说明:

http://wiki.alpinelinux.org/wiki/Running_glibc_programs

docker pull szyhf/bitcoin-alpine

起因

这几天在弄比特币核心的镜像,打算迁移一个已有服务到另一个服务器,dockerhub上已有的版本大多比较旧,而且很久没更新了,我对比特比核心的东西不熟悉,不敢随便用旧版,于是折腾了一下比特币核心的镜像,基于Ubuntu的镜像没啥好说的,很快的就搞定了,但是表示还是不太喜欢那么大的镜像(当然,我知道其实在服务器上也就存储一个根镜像),于是折腾起了Alpine版。

glibc

其实问题的出现也很简单,撇去下载bitcoind等可执行文件的时间(事实上,提前下好拷贝进去即可,当然,放dockerhub的版本除外),可执行的时候遇到了奇怪的问题,无论是x权限还是root用户都齐备的情况下,alpine无法把bintcond当作一个正常的可执行文件执行,当然,这完全有可能是因为该文件不是在alpine下编译出来的,而alpine也相对来说不是一个常见的操作系统(事实上它更多就是针对Docker的特性而产生的)。

 

于是,找了很久的资料以后终于找到一份比较完善的说明,整理如下:

  1. alpine使用的glic不是一般CentOs或者Ubuntu使用的版本,某种意义上可以看作是一个简化版,它能支持大部分的应用,但bitcoind除外。
  2. 所以使用的时候需要安装针对alpine专用的glic。
  3. 官网建议使用busybox的方案,暂时未验证。
  4. 使用的是另一个开源项目:https://github.com/sgerrand/alpine-pkg-glibc

解决方案

这种问题其实处理也简单,直接上代码了:

 


apk --no-cache add ca-certificates wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://raw.githubusercontent.com/sgerrand/alpine-pkg-glibc/master/sgerrand.rsa.pub wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/2.23-r3/glibc-2.23-r3.apk apk add glibc-2.23-r3.apk

简单说,下载,解压,安装,但装完以后,bitcoind仍然不能运行,但比刚才好一些的是,不再提示无法执行,只是提示找不到什么库(这篇文章是后写的,所以一时间不记得是什么库了)

alpine-pkg-glic的说明文档其实有提到,如果需要更多的locadef功能,就得再装一个glibc-bin(印象中跟报的错有关),所以解决方案就是在该项目下载另一个apk装了,解决。

 


ENV GLIBC_VERSION=2.23-r3 RUN apk update \ && apk --no-cache add wget ca-certificates \ && wget -q -O /etc/apk/keys/sgerrand.rsa.pub https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/sgerrand.rsa.pub \ && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk \ && wget https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-bin-${GLIBC_VERSION}.apk \ && apk --no-cache add glibc-${GLIBC_VERSION}.apk \ && apk --no-cache add glibc-bin-${GLIBC_VERSION}.apk \

之后bitcoind正常运行,问题解决。