使用golang alpine镜像编译go文件执行报错no such file or directory

编译的命令如下:

1
docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) -e GOPROXY=https://goproxy.cn golang:1.14.4-alpine3.12 go build main.go

执行:

1
no such file or directory: ./main

这个时候就很懵了,因为这个main文件是有可执行权限的。所以,这个file一定就不是指main文件了。分析后,猜测是它依赖的动态链接库不存在:

1
2
3
ldd main
linux-vdso.so.1 (0x00007ffe19b80000)
libc.musl-x86_64.so.1 => not found

果然,发现musl库不存在。alpine默认用的是musl库,并且,go编译的时候,默认会开启CGO,这个时候就会用到libc之类的库。所以,这里我们可以暂时关闭CGO,让编译通过:

1
docker run --rm -it -v $(pwd):$(pwd) -w $(pwd) -e CGO_ENABLED=0 -e GOPROXY=https://goproxy.cn golang:1.14.4-alpine3.12 go build main.go

当然,我们最好还是用和本机系统一样的docker环境来进行编译,这样,就可以正确的链接C库了。