在 docker 中使用 Golang 编译 RISC-V 应用

我想给 vision five 2 装个 web 服务器 caddy,结果发现它不提供 RISC-V 版的可执行文件下载。

那就只能自己编译咯,毕竟是开源应用嘛。

由于机器上也没有装 Go,所以我选择用其它的设备来交叉编译。

我编译的设备是 d2550,没想到它还能在这种地方发光发热。

docker run -it golang:alpine3.17
/go # go version
go version go1.20.2 linux/amd64

用 docker 可以很方便就拥有一个可编译的环境,那么接着需要下载代码,下载需要使用到 wget,由于我下载了 zip 压缩包,所以还得装一个 unzip,如果下载 tar 包就不用了。

apk add wget upzip
wget https://github.com/caddyserver/caddy/archive/refs/tags/v2.6.4.zip
unzip v2.6.4.zip

解压出来一个 caddy-2.6.4 的目录,那么进入这个目录,再进入 cmd/caddy

go env -w GOPROXY=https://goproxy.cn
go build

编译完成就会多出一个名为 caddy 的文件,不过这样编译的是 amd64 版的,我想要编译 RISC-V 版。

CGO_ENABLE=0 GOOS=linux GOARCH=riscv64 go build

这样编译之后,caddy 这个文件就变成 RISC-V 版的了,使用 file 命令可以查看

apk add file
# file caddy
caddy: ELF 64-bit LSB executable, UCB RISC-V, double-float ABI, version 1 (SYSV), statically linked, Go BuildID=Sl5DFjHtcm44runPVDQz/PtAVfjFrZ7ix6z2eqOtp/bjeL6tdqc9Bu0ZnsWsXf/--2q9FfQEXqHen90fHNn, with debug_info, not stripped

此时这个文件是在 docker 容器中的,我们可以使用 docker cp 命令将它复制出来。这里我是多开一个 ssh 标签。

需要先去查一下容器的 ID,用 docker ps,我这里查到是 bb95e6bfb7e9,然后像这样复制出来。

docker cp bb95e6bfb7e9:/go/caddy-2.6.4/cmd/caddy/caddy .

之后再想办法将它传到 RISC-V 开发板上。这一切完成之后,可以直接把容器删掉,甚至把镜像也删掉也行,不会生出多余的文件,很不错。