![](/img/trans.png)
[英]How to get docker architecture, like amd64, arm32v7, in alpine linux?
[英]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.