docker alpine中遇到 sh: ./go: not found

如下使用 alpine 基础镜像 编写 dockerfile 构建成镜像后,

FROM golang:1.17.5 AS build

# 编译-环境变量
ENV GO111MODULE=on
ENV GOPROXY=https://goproxy.cn,direct
ENV CGO_ENABLED=1
ENV GOARCH=amd64
ENV GOOS=linux

# 设置工作目录
WORKDIR /go/src/rns
COPY . .

RUN go build -o rns_linux_amd64 -ldflags "-w -s -X 'main.BUILD_TIME=`date`' -X 'main.GO_VERSION=`go version`'"
# 备注由于 golang 基础镜像本来就比较大 直接以这个为基础镜像打包 再生成项目镜像会很大


FROM alpine:latest

COPY --from=build /go/src/rns/rns_linux_amd64 /rns/rns_linux_amd64
COPY --from=build /go/src/rns/release/app.yaml /rns/app.yaml

WORKDIR /rns

CMD  ./rns_linux_amd64

运行 程序时,总是报错:

/bin/sh: ./rns_linux_amd64: not found

确认路径和其他配置正常后,使用 ldd 查看

/rns # ldd rns_linux_amd64
        /lib64/ld-linux-x86-64.so.2 (0x7f309b9f3000)
        libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f309b9f3000)
        libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f309b9f3000)

解决方式一:

由于alpine镜像使用的是musl libc而不是gnu libc,/lib64/ 是不存在的

但他们是兼容的,可以创建个软连接过去试试。

/rns # mkdir /lib64
/rns # ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
/rns # ./rns_linux_amd64
...正常输出

解决方式二:

使用go编译项目时 CGO_ENABLED 设置为 0, 启用静态编译,这样就不会依赖于lib64

作者:admin  创建时间:2022-11-24 10:25
最后编辑:joker.liu  更新时间:2023-04-23 14:39