前言
最近在做一个exporter的镜像,主要是考虑到监控不需要进入容器执行命令所以希望监控的镜像文件足够小,所以选择了alpine做基础镜像
1.问题描述
下边这是我的Dockerfile文件,当编译的时候会提示/bin/sh: ./tendisplus_exporter: not found
FROM alpine
COPY tendisplus_exporter /usr/local/bin/
RUN chmod 777 /usr/local/bin/tendisplus_exporter
ENTRYPOINT ["/usr/local/bin/tendisplus_exporter"]
虽然提示了上边的问题,我也按照网上的各种去换镜像源,安装bash等等一系列操作,然并卵
vi /etc/apk/repositories
#采用国内阿里云的源,文件内容为:
https://mirrors.aliyun.com/alpine/v3.6/main/
https://mirrors.aliyun.com/alpine/v3.6/community/
apk update
apk add bash
2.最终找到解决方案
1.先使用ldd查看二进制文件所需要的的依赖库,会发现我们的alpine根本就没有
/usr/local/bin # ldd tendisplus_exporter
/lib64/ld-linux-x86-64.so.2 (0x7fd23ed6c000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7fd23ed6c000)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7fd23ed6c000)
2.我们可以在编译go的二进制文件的时候设置go env -w CGO_ENABLED=0,之后再进行编译,将编译之后的二进制文件加到上边的Dockerfile中,重新制作镜像,就成功了
3.golang编译镜像
如果自己本地编译也是可以的,不过我做了一个go环境的编译镜像文件,当然和本题无关,本身不会go语言,vscode的各种设置各种折磨我,被逼无奈,下边是我的Dockerfile文件,这个镜像做出来,因为基础镜像是centos的,要800M,所以在这里边编译完,将编译文件拿到1中的镜像文件中,就可以大大的减小镜像文件大小了.
FROM centos
COPY go1.15.2.linux-amd64.tar.gz /opt/
RUN cd /opt \
&& tar -C /usr/local -xzf go1.15.2.linux-amd64.tar.gz \
&& rm -rf go1.15.2.linux-amd64.tar.gz
ENV PATH $PATH:/usr/local/go/bin
RUN mkdir -p /home/work/go \
&& export GOPATH=/home/work/go \
&& go env -w GO111MODULE=on \
&& go env -w GOPROXY=https://goproxy.cn \
&& go env -w CGO_ENABLED=0\
&& mkdir -p $GOPATH/src
COPY test /home/work/go/src/
RUN cd /home/work/go/src/test && go build -o test
ENTRYPOINT ["/home/work/go/src/test/test"]