技术解析

树莓派的 docker base image 该如何选择
0
2021-06-29 11:36:27
idczone

arm 架构的 image 比较少,不少都得自己 build

之前先是用 hypriot 的 base image,后来用官方的 armhf ,今天看 docker hub armhf 的 repo 已经不维护了,取而代之的是对架构分类更细的 arm32v5,arm32v6,arm32v7,arm64v8 这几个 repo,虽说 pi3 是 64 位的 cpu,但目前没找到功能完善的 64 位系统,v5 也不适合,arm32v6 和 arm32v7 这两个里选的话好像 arm32v6 适用性更广,包括 pi 1 或 zero 也能运行,不知道选 arm32v6 的镜像当 base image 的话在 pi3 上会不会对性能和使用有影响


Resin 的 base image 有没有试过?看介绍似乎挺不错的 https://docs.resin.io/runtime/resin-base-images

试过 resin 的,不过后来基本是用的 arm32v6 的 Alpine 和 arm32v7 的镜像,因为基本和 library 里的镜像是一致的,resin 的镜像有点太多了,docker hub 的搜索又不太好用,加上 arm32v7 的基本够用就没用 resin 的镜像了
另外它的系统 resin os 倒是挺特别的,基本是为物联网准备的,可以完全在云端操作,git push 之后自动 build,有点 ci/cd 的意思,不过好像只能部署一个容器,也可能是我用的姿势不对

如果用 arm32v6/7 作为 base image,是不是必须要在树莓派上 build image ?
我看中 resin 的 cross build 比较方便,在 github 上放了 dockerfile,docker hub 上创建一个 auto build,image 就在云上 build 好了。
像它的 [blog]( https://resin.io/blog/building-arm-containers-on-any-x86-machine-even-dockerhub/) 中的例子:
```
FROM resin/armv7hf-debian
RUN [ "cross-build-start" ]
RUN apt-get update
RUN apt-get install python
RUN pip install virtualenv
RUN [ "cross-build-end" ]
```

它那篇文章里介绍的方法其实就是在 arm 镜像中加入 qemu 来实现在 x86 平台进行编译
我试过的在 x86 上编译树莓派镜像有两种方法,都是要用 qemu
一种就是它这样在 Dockerfile 的编译部分前后加入 RUN [ "cross-build-start"]和 RUN [ "cross-build-end"],这种需要提前把 qemu 和它示例项目里的脚本加入镜像,这样可以在任何 x86 机器上进行 build,包括 dockerhub
另一种方法是通过在 x86 机器上运行:
```
docker run --rm --privileged multiarch/qemu-user-static:register --reset
```
之后就可以在这台机器上 build 或者是 run 任何 arm 镜像了,并且不需要修改原来的 Dockerfile
这两种方法都是可以在 x86 机器上 build arm image 的,不过 qemu 速度相当慢,大概只有运行 x86 镜像速度的 1/10,dockerhub 的自动 build 是有资源限制的,1cpu, 2g ram, 30g 硬盘,2 小时,大一点的项目用 qemu build 很容易就超时了,所以像 php 这种镜像还是要在树莓派上编译的,另外任何用到 gosu 的镜像是没办法用 qemu 的,会直接报错,这个问题存在很久了
除了用 dockerhub 其实也可以用 ci/cd 来 build,像 arm32v7 的镜像记得看日志是用 Jenkins 连了一个 pi 当 slave,另外 drone ci 现在也可以选择 arm 设备当 agent
我在 dockerhub 上建的这个 repo: https://hub.docker.com/r/pipill/ ,多数镜像就是用的第一种方法在 dockerhub 上自动 build 的,也就是你提到的博客里的方法

很有用的信息,谢谢!

数据地带为您的网站提供全球顶级IDC资源
在线咨询
专属客服