使用 Apline 作为基础镜像时可能会遇到的常见问题的解决方法

设置国内软件仓库镜像

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

还有另一个证书错误(待补充对应的 case 和详细错误信息)的原因是:编译的时候没有禁用 CGO,导致编译时使用了部分依赖 glic 的代码,解决方法就是通过 CGO_ENABLED=0
禁用 CGO(只在确认程序确实不依赖 CGO 也可以正常工作的情况下禁用):

CGO_ENABLED=0 go build

有时运行有些基于 alpine 的容器会提示 exec user process caused "exec format error"

常见原因:镜像中的程序编译的时候适配的不是当前运行该镜像的机器的 CPU 架构,比如程序和镜像编译时是为 x86 架构编译的,此时这个镜像就无法在 amd64 架构下运行,会报上面的错误。

简单记录了一下使用 Apline 作为基础镜像时可能会遇到的常见问题的解决方法(后面会持续更新)。

原文 

https://mozillazg.com/2020/03/use-alpine-image-common-issues.rst.html

本站部分文章源于互联网,本着传播知识、有益学习和研究的目的进行的转载,为网友免费提供。如有著作权人或出版方提出异议,本站将立即删除。如果您对文章转载有任何疑问请告之我们,以便我们及时纠正。

PS:推荐一个微信公众号: askHarries 或者qq群:474807195,里面会分享一些资深架构师录制的视频录像:有Spring,MyBatis,Netty源码分析,高并发、高性能、分布式、微服务架构的原理,JVM性能优化这些成为架构师必备的知识体系。还能领取免费的学习资源,目前受益良多

转载请注明原文出处:Harries Blog™ » 使用 Apline 作为基础镜像时可能会遇到的常见问题的解决方法

赞 (0)
分享到:更多 ()

评论 0

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址