2015-10-13 5 views
6

golang Version < 1.5 - es gibt viele statische Verknüpfung Beispiele, Beiträge und Rezepte. Was ist mit> = 1.5? (Die Google-Suche hat für meine Suchbegriffe keine nützlichen Ergebnisse geliefert.) Gibt es irgendwelche Empfehlungen, wie man eine statisch verknüpfte Binärdatei erzeugt, die in einem einfachen rkt-Container (aus CoreOS) ausgeführt werden kann?Wie erstellt man eine statisch verknüpfte Golang ausführbare Datei mit go 1.5+

mein gehen:

$go version 
go version go1.5 linux/amd64 

wenn ich versuche, meinen Behälter zu laufen:

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

ich:

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

was darauf hindeutet, dass die ausführbare Datei in dem Behälter auf diese wird in Abhängigkeit lib und daher nicht statisch.

mein manifest wie folgt aussieht:

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 

meine Befehlszeile die binäre zu bauen wie folgt aussieht:

go build ${myapp}.go 

Diese article hat einige Beispiele golang < 1.5. Und dann gibt es diesen getting started Artikel auf der CoreOS Seite.

+0

Können Sie uns zeigen, wie Sie Ihre App Gebäude sind? Der Prozess hat sich nicht wirklich verändert. – JimB

+0

und ich habe einige Links zu Artikeln hinzugefügt. – Richard

+4

hast du 'CGO_ENABLED = 0' gesetzt? – JimB

Antwort

8

Ich hasse es, meine eigene Frage zu beantworten. Die Kommentare sind korrekt CGO_ENABLED=0 go build ./... scheint der Trick getan haben.

Obwohl es nicht Teil der ursprünglichen Frage war, konnte das Programm nach der Ausführung des Programms im rkt-Container keine ordnungsgemäße DNS-Anfrage mehr ausführen. Es muss also noch etwas anderes passieren.

+0

Läuft das auf Mac OS X (Darwin)? Ich dachte, dies sei die einzige Plattform, bei der DNS-Lookups nicht von Go selbst ausgeführt werden. – Volker

+1

@Volker: DNS-Lookups werden in go ausgeführt, wenn nsswitch.conf dies zulässt, aber der cgo-Resolver ist immer noch verlinkt, so dass er bei Bedarf verwendet werden kann (es gibt auch eine 'GODEBUG = netdns =' Option für die Umschaltung zur Laufzeit) benötigt beides) – JimB

+1

@Richard müssen Sie Ihre eigenen/etc/hosts zu Ihrem Container hinzufügen, so wie sie [hier] (https: // github.com/coreos/etcd/blob/master/scripts/build-aci # L64), im etcd-Projekt. –

5

Statische Verknüpfung:

Go 1.5:

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

Mit Go 1.6 ich benutzen musste:

go build -ldflags "-linkmode external -extldflags -static" ... 
Verwandte Themen