docker是跨平台的?_利用docker实现Golang程序的交叉编译 – 萌叔

版权声明 本站原创文章 由 萌叔 发表
转载请注明 萌叔 | http://vearne.cc

1. 前言

萌叔有有一个开源项目vearne/passwordbox,用于密码的管理。笔者想法是在Mac上build出多个平台下的bin文件,这样用户,可以无需自己编译,直接使用编译好的bin文件。

可是 vearne/passwordbox 内部依赖了 mattn/go-sqlite3。这个库编译时,依赖操作系统上的共享库,无法直接进行交叉编译。

2. 解决

前段时间,萌叔在阅读buger/gorepla源码时,偶然发现它有一个思路是利用docker来实现Golang交叉编译。于是笔者借鉴了它的思路,修改了passwordbox Makefile。
现在在Mac上执行

make docker-img # 只需要执行一次,生成基础镜像即可
make release

就可以同时生成Mac和linux下的bin文件

pwbox-v0.0.10-darwin-amd64.tar.gz

完整代码见Makefile

2.1 build一个基础镜像用于linux环境的编译
docker-img:
    docker build --rm -t $(CONTAINER) -f Dockerfile.dev .

Dockerfile.dev

FROM golang:

RUN apt-get update && apt-get install vim-common -y


WORKDIR /go/src/github.com/vearne/passwordbox/
ADD . /go/src/github.com/vearne/passwordbox/

RUN go get

golang: 实际是基于Ubuntu的一个镜像(Linux)

借助Docker实现跨平台编译
release-linux:
    docker run -v `pwd`:$(SOURCE_PATH) -t -e GOOS=linux -e GOARCH=amd64 -i $(CONTAINER) go build $(LDFLAGS) -o pwbox
    tar -zcvf pwbox-$(VERSION)-linux-amd64.tar.gz ./pwbox
    rm pwbox
-v pwd:$(SOURCE_PATH)

是为了把项目的代码直接挂载到docker中,这样就无需每次拷贝代码到docker中

-i 参数

使用交互模式启动docker,build生成出来的bin文件是直接产生在宿主机上的

3. 共享库依赖错误

当萌叔把生成好的拷贝到某台linux机器上,试图运行时,报了如下错误。

[root@dev01]# ./pwbox -v
./pwbox: /lib/x86_64-linux-gnu/: version `GLIBC_8' not found (required by ./pwbox)

进一步

[root@dev01]# ls -l /lib/x86_64-linux-gnu/
lrwxrwxrwx 1 root root 12 Jun  5 01:25 /lib/x86_64-linux-gnu/ -> libc-7.so

这个其实是GNU C Library,它是一个共享库。
报错的原因是在编译环境中

 -> libc-8.so

而在部署环境中,libc的版本太低导致。

 -> libc-7.so

对于这种情况有2种办法

  • 1)升级部署环境的libc(见参考资料1)
  • 2)降低编译环境libc的版本,经过测试,libc库是向后兼容的,将基础镜像从golang:退到golang:,对应的问题即可解决。

4. 后记

github里还有一个Golang跨平台编译工具karalabe/xgo, 可以一条命令生成windows、linux、mac下的bin文件。
当然它的思路也是借助docker来实现跨平台的编译。

参考资料

  1. 升级glibc: 解决”: version ‘’ not found”问题
  2. The GNU C Library

打赏我

9056fdef8f913e052033edc041bc00d0.png

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值