解决docker alpine /bin/sh: ./main: not found
- golang中编译之后的二进制文件部署在alpine镜像中出现了not found问题解决
- 这种情况是因为动态链接库位置错误导致的,alpine镜像使用的是musl libc而不是gun libc。因而动态链接库的位置不一致。
- 在基础镜像内执行:mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
- 加了软连接之后发现还是如图下问题
解决Error loading shared library libresolv.so.2: No such file or directory (needed by ./main)
- 在 Alpine Linux 上,使用的是 musl libc 而不是 glibc,因此一些符号可能会有所不同。你可以尝试使用静态链接的方式来构建你的 Go 二进制文件,以便它包含所需的依赖关系。
编译的时候加上这几个参数就可以解决了
这里的 CGO_ENABLED=0 禁用了 CGO,而 -a 标志强制重新构建所有包,-installsuffix cgo 防止 CGO 生成 CGO 链接的对象。
CGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main .
请确保你的 Go 项目没有引用 cgo,并使用静态编译重新构建容器镜像。重新构建容器时使用:
docker build -t xxx:1.0 .
最后花了一天找资料终于解决了
还有docker拉取alpine镜像很慢
下载Alpine镜像很慢有时候会卡住,因为使用的资源默认是境外服务器,将境外服务器替换为国内服务器即可
# 表示依赖 alpine 最新版
FROM alpine:latest
# 下载Alpine镜像很慢有时候会卡住,因为使用的资源默认是境外服务器,将境外服务器替换为国内服务器即可
RUN set -eux && sed -i 's/dl-cdn.alpinelinux.org/mirrors.tuna.tsinghua.edu.cn/g' /etc/apk/repositories
这是我的部署脚本方法
function deploy2 {sudo rm -f maingo build -o main main.goCGO_ENABLED=0 GOOS=linux go build -a -installsuffix cgo -o main main.gosudo chown root:root mainsudo chmod +x mainsudo docker build -f Dockerfile2 -t $name:$version .sudo rm -f mainsudo docker rm $name -fsudo docker run --restart=always --name $name -p 8087:8080 -v $logs:/apps/log -e Mode="$mode" -d $name:$version
}
完整的dockerfile和sh脚本你看我的另一篇文章golang部署
https://blog.csdn.net/qq_39272466/article/details/131212322?spm=1001.2014.3001.5502