alpine 镜像常见操作

alpine 只有 5mb 的身材让人佩服,同时又具备很强的安全性,除了预装的软件,我们还可以基于 alpine 安装需要的软件。

1. alpine 镜像安装软件

比如期望基于 alpine 镜像安装 jq 软件。

FROM alpine:3.14.2
RUN apk add --update jq  && rm -rf /var/cache/apk/*
1
2

2. 使用 alpine-glibc 镜像

执行二进制提示 二进制 not found,比如 /bin/sh: dog: not found

最后排查是因为默认 alpine 镜像中缺少 GLIBC 库,而是 MUSL LIBC

该二进制文件是使用动态链接方式编译了一个使用了 GLIBC 库的程序生成的

有两种方法解决

2.1 直接使用 alpine-glibc 镜像

# docker pull jeanblanchard/alpine-glibc
1

据图可以查看对应开源项目:构建 alpine-glibc 镜像open in new window

FROM alpine:3.14.2
MAINTAINER Jean Blanchard <jean@blanchard.io>

ENV GLIBC_VERSION 2.34-r0

# Download and install glibc
RUN apk add --update curl && \
  curl -Lo /etc/apk/keys/sgerrand.rsa.pub https://alpine-pkgs.sgerrand.com/sgerrand.rsa.pub && \
  curl -Lo glibc.apk "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-${GLIBC_VERSION}.apk" && \
  curl -Lo glibc-bin.apk "https://github.com/sgerrand/alpine-pkg-glibc/releases/download/${GLIBC_VERSION}/glibc-bin-${GLIBC_VERSION}.apk" && \
  apk add glibc-bin.apk glibc.apk && \
  /usr/glibc-compat/sbin/ldconfig /lib /usr/glibc-compat/lib && \
  echo 'hosts: files mdns4_minimal [NOTFOUND=return] dns mdns4' >> /etc/nsswitch.conf && \
  apk del curl && \
  rm -rf glibc.apk glibc-bin.apk /var/cache/apk/*
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15

2.2 编译时使用静态编译

如果你是代码构建者,可以改为静态编译,不要依赖 GLIBC ,比如编译 Go 程序的时候指定 CGO_ENABLED=0

reference