簡體   English   中英

如何使用 golang docker 容器構建 linux/amd64 golang 可執行文件?

[英]How to build linux/amd64 golang executable with golang docker container?

我有一台 AWS 服務器在架構中運行 ubuntu

arch
x86_64

和ubuntu版本

lsb_release -a
No LSB modules are available.
Distributor ID: Ubuntu
Description: Ubuntu 20.04.3 LTS
Release: 20.04
Codename: focal

我在 arm64 中有一台本地機器,用作 CI 機器。 我想自動編譯 go 可執行文件,然后通過 ftp 將其發送到服務器機器。

現在我正在做以下事情:

docker container run --rm --entrypoint='' \
    --platform linux/amd64 \
    -v ~/Desktop/dl_api:/usr/src/app \
    -w /usr/src/app \
    golang:1.18.3-alpine /bin/sh -c 'go build -o start main.go'

並獲取本地start的可執行文件。 到目前為止,一切都很好。

我將其上傳到目標服務器,並在嘗試在遠程服務器上執行時出現錯誤

No such file or directory

我知道這可能發生在不同架構或 32 64 位等情況下。

為了驗證我運行file命令並得到:

 file start
d-s: ELF 64-bit LSB executable, x86-64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-musl-x86_64.so.1, Go BuildID=jRqecrUNY3eBsSA951ei/ZZc4L0wFJ5opPN5rzoB5/XSBZzvQIfKH3hal5Dwa1/i-7Fctngr_y415-Qw_UB, not stripped

這里可能是什么問題,我該如何解決這個問題,以便我編譯的二進制文件在目標服務器上運行?

如果您注意到我的命令,我已經在 docker run 命令中指定了 platform --platform linux/amd64 \ 我想針對 amd64 進行編譯並能夠在 ubuntu 20.04 下運行

更新:正如你們中的一些人所建議的,我還在構建過程中添加了環境變量,例如

    -e GOOS=linux \
    -e GOARCH=amd64 \

並且仍然有同樣的問題。

我不熟悉使用這樣的 run 命令構建容器,但我認為您只需將架構指定為go build命令的一部分,如下所示:

env GOOS=linux GOARCH=amd64 go build -o start main.go

這就是為 docker 之外的特定架構構建二進制文件的方式。

在您的 docker 命令的上下文中:

docker container run --rm --entrypoint='' \
    --platform linux/amd64 \
    -v ~/Desktop/dl_api:/usr/src/app \
    -w /usr/src/app \
    golang:1.18.3-alpine /bin/sh -c 'env GOOS=linux GOARCH=amd64 go build -o start main.go'

我不認為--platform linux/amd64是必需的。 那是指定容器將運行的平台(來自文檔,“如果服務器支持多平台,則設置平台”)

這里有一個教程,更詳細地討論了構建跨平台。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM