Golang使用Alpine基础镜像问题

xiaohai 2020-08-05 11:15:47 4083人围观 标签: Docker  Go 
简介Golang如果直接使用Alpine基础镜像进行打包,在运行的时候会出现如下问题:standard_init_linux.go:211: exec user process caused "no such file or directory"

如果在使用Docker打包发布Golang应用程序的时候,如果编译命令是:

go build -o hello

Dockerfile文件内容如下:

FROM alpine:latest MAINTAINER UserName "xxxxxxx@qq.com" WORKDIR /app ADD hello /app/ EXPOSE 80 ENTRYPOINT ["./hello"]

那么我们通过docker run运行后会出现如下问题:

standard_init_linux.go:211: exec user process caused "no such file or directory"

如何解决上面的问题呢?最简单的方式就是直接使用centos镜像,这样不好的就是编译后的镜像太大了。如果还是想使用alpine镜像,那么就需要在编译的时候加上–tags netgo参数,具体为什么需要自行去分析下,可能是因为该镜像的底层库的问题。那么编译命令如下:

go build --tags netgo -o hello

Alpine镜像还有另外一个问题,一般我们都都会对容器进行设置时区,如果现在还是通过:

RUN /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone

是不行的,运行的时候会出现:

cp: can't stat '/usr/share/zoneinfo/Asia/Shanghai': No such file or directory

因为Alpine镜像没有时区设置功能,需要安装时区设置,最终命令如下:

RUN apk update && \
    apk add tzdata && \
    /bin/cp /usr/share/zoneinfo/Asia/Shanghai /etc/localtime && echo 'Asia/Shanghai' >/etc/timezone