2015-10-13 46 views
6

golang版本< 1.5 - 有很多静态链接示例,文章和食谱。那么> = 1.5呢? (谷歌搜索没有返回任何有用的结果,我的搜索条件。)任何人有任何建议如何产生一个静态链接的二进制文件,可以在一个基本的rkt(从CoreOS)容器内执行?如何创建一个静态链接golang可执行文件1.5+

我去:

$go version 
go version go1.5 linux/amd64 

,当我尝试运行我的容器:

sudo rkt --insecure-skip-verify run /tmp/FastBonusReport.aci 

我得到:

[38049.477658] FastBonusReport[4]: Error: Unable to open "/lib64/ld-linux-x86-64.so.2": No such file or directory 

表明在容器中的可执行文件根据此lib,因此不是静态的。

我的清单看起来像:

cat <<EOF > /tmp/${myapp}/manifest 
{ 
    "acKind": "ImageManifest", 
    "acVersion": "0.9.0", 
    "name": "${lowermyapp}", 
    "labels": [ 
     {"name": "os", "value": "linux"}, 
     {"name": "arch", "value": "amd64"} 
    ], 
    "app": { 
     "exec": [ 
      "/bin/${myapp}" 
     ], 
     "user": "0", 
     "group": "0" 
    } 
} 
EOF 

我的命令行来构建二进制的样子:

go build ${myapp}.go 

article有几个例子golang < 1.5。然后在CoreOS网站上有这个getting started文章。

+0

你能告诉我们你是如何构建你的应用程序?这个过程并没有真正改变。 – JimB

+0

,我添加了一些文章链接。 – Richard

+4

你有设置'CGO_ENABLED = 0'吗? – JimB

回答

8

我讨厌回答我自己的问题。评论是正确的CGO_ENABLED=0 go build ./...似乎已经做了伎俩。

虽然它不是原始问题的一部分,但一旦程序开始在rkt容器中执行,它就无法执行正确的DNS请求。所以一定还有其他事情正在发生。

+0

这是在Mac OS X(达尔文)上运行吗?我认为这是唯一的平台,DNS查询不是Go完成的。 – Volker

+1

@Volker:当nsswitch.conf允许时,dns查找在go中完成,但cgo resolver仍然是链接的,因此可以在需要时使用它(还有一个'GODEBUG = netdns ='选项可以在运行时来回切换,需要两个都可用) – JimB

+1

@Richard你必须添加你自己的/ etc/hosts到你的容器,就像他们[在这里](https:// github。com/coreos/etcd/blob/master/scripts/build-aci#L64)。 –

5

静态链接:

围棋1.5:

go build -ldflags "-extldflags -static" ... 

一起去1.6,我不得不使用:

go build -ldflags "-linkmode external -extldflags -static" ... 
相关问题