2015-10-13 6 views
6

golangバージョン< 1.5 - 静的リンクの例、投稿、レシピがたくさんあります。 > = 1.5はどうですか? (Google検索では、検索用語に有用な結果が返ってこなかった)。誰でも、基本的なrkt(CoreOS)コンテナ内で実行できる静的リンクバイナリの作成方法についての推奨はありますか?go 1.5+を使って静的にリンクされたgolang実行ファイルを作成する方法

私の行く:

$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は< 1.5をgolang例をいくつか持っているよう

私のマニフェストが見えます。 CoreOSサイトにはgetting startedという記事があります。

+0

あなたはどのようにアプリを構築している私たちを見ることができますか?プロセスは本当に変わっていません。 – JimB

+0

と記事へのリンクをいくつか追加しました。 – Richard

+4

あなたは 'CGO_ENABLED = 0'を設定しましたか? – JimB

答えて

8

私自身の質問に答えるのは嫌です。コメントは正しいですCGO_ENABLED=0 go build ./...は、トリックを行っているようです。

元の質問の一部ではありませんが、プログラムがrktコンテナで実行を開始すると、適切なDNS要求を実行できませんでした。だから何か別のものがなければならない。

+0

これはMac OS X(darwin)で動作していますか?私はこれが、DNS検索がGo自身で行われていない唯一のプラットフォームだと思いました。 – Volker

+1

@Volker:DNS検索はnsswitch.confが許可するときにgoで実行されますが、cgoリゾルバはまだリンクされているため、必要なときに使用できます(実行時に前後に切り替えるための 'GODEBUG = netdns =両方とも利用可能です) – JimB

+1

@リチャードあなたが自分の/ etc/hostsをコンテナに追加する必要があります。ここには[ここ](https:// github。etc/coreos/etcd/blob/master/scripts/build-aci#L64)をetcdプロジェクトに追加します。 –

5

静的リンク:

ゴー1.5:

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

ゴー1.6で私が使用していた:

go build -ldflags "-linkmode external -extldflags -static" ... 
関連する問題