目录结构
个人小笔记:alpine系统明明安装了go,命令行输入 go version 提示:/bin/sh: go: not found,/bin/sh: go:没有找到,就觉得很奇怪!后来到网上看了一下才知道
/ # go version
/bin/sh: go: not found
/ # go version
/bin/sh: go: not found
[root@test go]# wget https://go.dev/dl/go1.17.5.linux-amd64.tar.gz
[root@test go]# ls
Dockerfile go1.17.5.linux-amd64.tar.gz
Dockerfile文件
FROM alpine:3.12
ADD go1.17.5.linux-amd64.tar.gz /usr/local/
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 && \
ln -s /usr/local/go/bin/go /usr/bin/go && ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt
FROM alpine:3.12
ADD go1.17.5.linux-amd64.tar.gz /usr/local/
RUN mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2 && \
ln -s /usr/local/go/bin/go /usr/bin/go && ln -s /usr/local/go/bin/gofmt /usr/bin/gofmt
内容详解:
1、指定alpine版本
FROM alpine:3.12
2、去到golang官网下载安装包:Downloads - The Go Programming Language
https://go.dev/dl/go1.17.5.linux-amd64.tar.gz
3、由于Alpine镜像使用的根本不是gnu libc而是musl libc,所以/lib64/ld-linux-x86-64.so.2是不存在的,而实际上/lib64都是不存在的。
1.进入到容器,使用ldd查看二进制文件所需要的的依赖库,会发现我们的alpine根本就没有,提示动态连接库错误,ldd提示信息如下所示
上面这些alpine系统根本就没有,所以才会出现/bin/sh: go: not found
2、gnu libc和musl libc号称兼容(部分兼容),所以做个软链接过去
mkdir /lib64 && ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2
先创建lib64目录:mkdir /lib64
再做软链接:ln -s /lib/libc.musl-x86_64.so.1 /lib64/ld-linux-x86-64.so.2