2015-10-13 24 views
6

golang < 1.5 - có rất nhiều ví dụ liên kết tĩnh, bài đăng và công thức nấu ăn. Điều gì về> = 1,5? (google search đã không trả lại kết quả hữu ích nào cho thuật ngữ tìm kiếm của tôi.) Bất cứ ai cũng có bất kỳ khuyến nghị nào về cách tạo ra một nhị phân liên kết tĩnh có thể được thực hiện bên trong một rkt cơ bản (từ CoreOS) container?cách tạo tệp thực thi golang được liên kết tĩnh với phiên bản 1.5+

đi của tôi:

$go version 
go version go1.5 linux/amd64 

khi tôi cố gắng chạy container của tôi:

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

tôi nhận được:

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

gợi ý rằng các thực thi trong container là tùy thuộc vào này lib và do đó không tĩnh.

manifest của tôi trông giống như:

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 

dòng lệnh của tôi để xây dựng các nhị phân trông giống như:

go build ${myapp}.go 

article này có một vài ví dụ golang < 1.5. Và sau đó có bài viết getting started này trên trang web CoreOS.

+0

bạn có thể chỉ cho chúng tôi biết bạn đang xây dựng ứng dụng của bạn? Quá trình này không thực sự thay đổi. – JimB

+0

và tôi đã thêm một số liên kết vào bài viết. – Richard

+4

bạn đã đặt 'CGO_ENABLED = 0' chưa? – JimB

Trả lời

8

Tôi ghét trả lời câu hỏi của riêng mình. Các ý kiến ​​đã được chính xác CGO_ENABLED=0 go build ./... dường như đã thực hiện các trick.

Mặc dù nó không phải là một phần của câu hỏi ban đầu, khi chương trình bắt đầu thực hiện trong vùng chứa rkt, nó không thể thực hiện yêu cầu DNS đúng. Vì vậy, phải có một cái gì đó khác đang xảy ra quá.

+0

Điều này có đang chạy trên Mac OS X (darwin) không? Tôi nghĩ rằng đây là nền tảng duy nhất mà tra cứu DNS không được thực hiện bởi Go chính nó. – Volker

+1

@Volker: Dns tra cứu được thực hiện trong khi nsswitch.conf cho phép, nhưng giải quyết cgo vẫn được liên kết để nó có thể được sử dụng khi cần thiết (cũng có một tùy chọn 'GODEBUG = netdns =' để chuyển đổi qua lại trong thời gian chạy, cần cả hai có sẵn) – JimB

+1

@Richard bạn phải thêm/etc/hosts của riêng bạn vào vùng chứa của bạn, giống như chúng làm [ở đây] (https: // github.com/coreos/etcd/blob/master/scripts/build-aci # L64), trong dự án etcd. –

5

tĩnh liên kết:

Go 1.5:

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

Với Go 1.6 Tôi đã phải sử dụng:

go build -ldflags "-linkmode external -extldflags -static" ... 
Các vấn đề liên quan