前言¶
简单记录一下使用 Alpine 作为基础镜像时可能会遇到的常见问题的解决方法。
设置国内软件仓库镜像¶
alpine 镜像默认的软件仓库在国外,有时 docker build 的时候安装软件包会很慢。
解决方法:使用国内的软件包镜像,比如 https://mirrors.ustc.edu.cn 的镜像:
RUN sed -i 's!http://dl-cdn.alpinelinux.org/!https://mirrors.ustc.edu.cn/!g' /etc/apk/repositories
panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory¶
有些使用 alpine 作为基础镜像的 go 程序镜像可能会出现类似下面这样的错误:
panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
常见原因:alpine 基础镜像中没有包含时区信息文件,当代码中有调用类似下面这样的通过名称获取时区信息的时候,就会出现上面的错误:
lc, err := time.LoadLocation("Asia/Shanghai") if err != nil { panic(err) } panic: open /usr/local/go/lib/time/zoneinfo.zip: no such file or directory
解决方法:安装 tzdata 这个包:
RUN apk --no-cache add tzdata
配置时区¶
可以通过下面的方法配置时区,大部分程序都会认这个配置:
RUN apk --no-cache add tzdata && \ cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && \ echo "Asia/Shanghai" > /etc/timezone ENV TZ Asia/Shanghai
明明镜像中有对应的二进制文件,但是执行时却提示 not found 或 no such file¶
有时可能会遇到明明镜像中存在相应的二进制文件,但是执行对应的二进制文件时却提示 not found 或 no such file 错误,类似下面这样:
# ls /usr/bin/grep /usr/bin/grep # /usr/bin/grep /bin/sh: /usr/bin/grep: not found
常见原因:该二进制文件是使用动态链接方式编译了一个使用了 GLIBC 库的程序生成的,但是 alpne 镜像中没有 GLIBC 库而是用的 MUSL LIBC 库,这样就会导致该二进制文件无法被执行。
解决办法:下面两个解决方法
- 改为静态编译
- 如果要使用动态链接函数编译的话,不要依赖 GLIBC (比如编译 Go 程序的时候指定 CGO_ENABLED=0 ) 或者在 alpine 中编译一个依赖 MUSL LIBC 的版本
Go 程序访问 https 服务时提示证书问题:x509: certificate signed by unknown authority¶
Go 程序使用 alpine 作为基础镜像时有时可能会遇到程序中访问 https 服务时会提示证书问题 x509: certificate signed by unknown authority
常见原因:镜像内的 CA 证书信息太老了,需要更新一下:
RUN apk add --no-cache ca-certificates && \ update-ca-certificates
exec user process caused "exec format error"¶
有时运行有些基于 alpine 的容器会提示 exec user process caused "exec format error" 。
常见原因:镜像中的程序编译的时候适配的不是当前运行该镜像的机器的 CPU 架构,比如程序和镜像编译时是为 x86 架构编译的,此时这个镜像就无法在 amd64 架构下运行,会报上面的错误。
总结¶
简单记录了一下使用 Apline 作为基础镜像时可能会遇到的常见问题的解决方法(后面会持续更新)。
参考资料¶
- Alpine Linux 源使用帮助 — USTC Mirror Help 文档
- takecy/tz-sample: Sample for alpine with timezone in Golang
- Error Executing 'ps' Command RHEL 7.x/8x - Ubuntu 19x · Issue #501 · aquasecurity/kube-bench
- Go-compiled binary won't run in an alpine docker container on Ubuntu host - Stack Overflow
- Cross Compiling Golang with a Docker Alpine Container -- JeffSloyer.io
- net - The Go Programming Language
- Setting the timezone - Alpine Linux
Comments