alpine的docker容器中不能运行golang的二进制文件

5 篇文章 0 订阅

前言

最近在做一个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"]

 

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值