很多官方 docker 镜像都出了基于 alpine 的版本,相较于正常的版本, alpine 版会有什么坑吗?
如果 alpine 版本的没有任何坑,那么相较于那些基于 Debian,Ubuntu,CentOS 的镜像,有体积大小的绝对优势。 那那些版本还有什么存在的必要?而且很多都会把那些作为默认的(例如 latest ) tag,而 alpine 版的后面还要跟上-alpine 的 tag
1. 单独的服务有优势,但是如果在一台机子上部署 N 个服务的话,alpine 便没有优势
另外,如果涉及编译的话,alpine 用的是 musl libc,这一点要注意
2. 相比于 alpine,你提到的那些系统有更加丰富的软件库、系统各种特性用法的普及度更高,在已有镜像基础上去安装新的程序成本更低。
3. 拿来单独当服务器也挺好玩的版本,真的很快,还默认源里就有。
4。 docker 镜像是共享的,
也就是所有底层是 ubuntu1804 的 nginx、php 镜像共用一个 ubuntu1804,单个看着空间占用大,但是平均起来并没有多少。
所以只要还有一个依赖于 ubuntu,那么其他的即使换成 alpine 并不会减小总空间占用,还会增加 alpine 的占用,意义就不是很大了。
5. alpine 没用过几次,ubuntu 的库还是比 alpine 齐全,资料也好查。
6. 像有些镜像就没有 alpine 版本,比如 MySQL。
直接使用的话其实没啥区别,区别只在于你要使用它作为自己的镜像的 From 的时候,alpine 版本可能无法提供你所需要的东西
7. 目前碰到一个坑,就是没有内置信任的 https 根证书
解决:
https://hackernoon.com/alpine-docker-image-with-secured-communication-ssl-tls-go-restful-api-128eb6b54f1f
FROM alpine:latest
RUN apk update && apk add ca-certificates && rm -rf /var/cache/apk/*
COPY ./mycert.crt /usr/local/share/ca-certificates/mycert.crt
RUN update-ca-certificates
8. 如果是 python 就没太大必要用了,因为很可能要装一大堆依赖,不但浪费时间,也可能有不可预见的问题,因为 musl,最重要的是得到的镜像大小并没有差别很大
apline 的 musl 在 /etc/resolv.conf 里不支持全部 option set, 对 dns 有特殊要求的可能有问题.
还有 apline 里面是 busybox, 有些程序如果用 shell 调用一些系统命令, 可能参数不一样会出错(比如 fluentd 的某个版本调用 gzip)
> 但是如果多个镜像(包括每个镜像运行的多个容器)使用了同一个基础镜像,是不会花费额外的空间的
> 也就是所有底层是 ubuntu1804 的 nginx、php 镜像共用一个 ubuntu1804
理想情况是这样
实际上 docker hub 的每个镜像的 FROM ubuntu:latest 未必是同一个,几十个 ubuntu:latest 和几十个 alpine:latest 可能会有不小差距
每个 image 都自己从头 build 且统一更新的可以忽略这点
9. 由于 glibc,所以好多通用软件没法直接用。比如 jdk,当时被坑了一晚上。找了 zulu 专门对 apline 编译过的 openjdk。虽然 alpine 的源里就有。当时没配置好网络,没法用 apk 安装
10. 缺 glibc 主要坑就是效率问题。
主要参考:https://www.v2ex.com/amp/t/581888