最近在 docker 镜像里都是使用 alpine 作基础镜像,后面因为 alpine 不支持 glibc 又尝试了 busybux。
两个都很轻量,也都能满足基本的需求,但是长远来看,alpine 可能更好用,主要是它可以安装其它软件,这使得扩展起来非常方便。

基础信息

镜像地址:https://hub.docker.com/_/alpine
名称:alpine
官网: https://alpinelinux.org
软件库:https://pkgs.alpinelinux.org/packages

安装软件

FROM alpine:3.14
RUN apk add --no-cache mysql-client

在镜像里使用 apk add <package-name> 即可安装软件。
--no-cache 表示不使用本地缓存来安装软件包,直接从远程下载仓库下载,也不会保存软件包缓存。可以让构建的镜像更小。

换源

https://mirrors.tuna.tsinghua.edu.cn/help/alpine/

sed -i 's#https\?://dl-cdn.alpinelinux.org/alpine#https://mirrors.tuna.tsinghua.edu.cn/alpine#g' /etc/apk/repositories

换成清华的镜像源。

支持 glibc

golang 的程序都需要 glibc 库,但是 alpine 系统里没有 glibc,这样有两种方式解决。
构建时打包所有链接库

CGO_ENABLED=0 GOOS=linux GOARCH=amd64 go build -a -ldflags '-extldflags "-static"' ./main.go

这样构建的时候会把动态链接库也打包到二进制里,就不需要系统里包含了。
安装 glibc 兼容库

apk add gcompat

https://wiki.alpinelinux.org/wiki/Running_glibc_programs
gcompat 提供了兼容 glibc 的 API,安装后就可以正常运行需要 glibc 的程序了。