2015-10-13 78 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" ... 
相關問題