aarch64 下使用 Docker 的项目构建
前段时间把玩了一下 96Core 128Memory 250SSD aarch64 Ubuntu-16.04 $0.50/hour 的服务器
记录一些使用 Docker 的项目构建的事情.
Why?
- 之前需要将项目搬到 ARMv8 架构下的服务器, 所以找了个云服务商, 用了下 aarch64 下的 Linux 来构建 Docker 相关的项目.
Env
1 | $ uname -a |
开始构建吧!
apt
如果需要国内源, 在此 Ubuntu Ports 源使用帮助. 为什么是 debian 系? 主要是因为 Docker 官方的源没能提供除 ubuntu 外的 arm64 版本.
Docker
系统自带的 ubuntu 源直接安装 docker 会得到 1.12 还是 1.13 左右版本的 docker. 更新版本的 docker 即使官方网站, 也没能找到说支持 arm64 系统的源, 只能自己找了. 好在还是很简单的 download.docker.com/linux. 在 debian/ubuntu/raspbian 下有更新版本的 docker.
Docker images
aarch64 下 所有的原先项目的基础镜像都不能用, 需要修改 Dockerfile 的基础镜像到 Docker hub/arm64v8.
etcd
项目用到了 etcd, etcd 没能提供 aarch64 的 bin, 不仅需要自己编译(golang 项目的编译还是挺简单的, 大部分 go get 即可), 还需要在运行时加上 ETCD_UNSUPPORTED_ARCH=arm64
的环境变量, 否则直接 exit. (32-bit and other unsupported systems)
To avoid inadvertently running a possibly unstable etcd server, etcd on unstable or unsupported architectures will print a warning message and immediately exit if the environment variable ETCD_UNSUPPORTED_ARCH is not set to the target architecture.
pyinstaller
使用 pip install 下来的 pyinstaller 会没有在 aarch64 下的 bootloader. 所以需要自己编译 pyinstaller 的 bootloader. 即便如此, 在其实现上, 因为对系统架构判断逻辑的问题, 会导致其使用了错误的 bootloader. 暂时地将正确的 bootloader 给复制到了被 错误
使用的目录下来了…(正确方式: 提 issue + PR)
1 | # 下载 3.3 版本的 pyinstaller |
alpine
为了镜像小, 一般会用 alpine, 但是用了 pyinstaller 构建后会需要 glibc. 反正 aarch64 下的 glibc 要么找不到, 要么自己构建出错, 解决了重新构建又是很久. 就懒得用了…换了用其他大一点的基础镜像(用的起 aarch64 的也不差钱~).
其他
- htop 看起来挺壮观的…
- 另外 aarch64 下所有的构建都很慢…
Reference
Ubuntu Ports 源使用帮助
docker 官方源
arm64v8 基础镜像
ETCD Supported systems
原文作者: Pike.SZ.fish
原文链接: https://page.pikeszfish.me/2017/12/24/build-with-aarch64/
许可协议: 本文采用知识共享署名-非商业性使用 4.0 国际许可协议进行许可