クロスコンパイル
Goはクロスコンパイルをサポートしています。
つまり、MacOS上でWindows上、Linux上それぞれで動作するバイナリを生成することができます。CPUアーキテクチャも複数サポートしています。
クロスコンパイルできると
実行環境用のバイナリを生成できるということは、わざわざGoが動作する環境を用意する必要がありません。(Goの環境構築は比較的容易ですが)
もっというと、リポジトリをcloneする必要がなかったり、コンテナにはバイナリ一つ載せればよいということになります。
クロスコンパイルできる環境
クロスコンパイルできる環境一覧です。
OS/CPUアーキテクチャ
で表示されています。
$ go tool dist list
aix/ppc64
android/386
android/amd64
android/arm
android/arm64
darwin/amd64
darwin/arm64
dragonfly/amd64
freebsd/386
freebsd/amd64
freebsd/arm
freebsd/arm64
freebsd/riscv64
illumos/amd64
ios/amd64
ios/arm64
js/wasm
linux/386
linux/amd64
linux/arm
linux/arm64
linux/loong64
linux/mips
linux/mips64
linux/mips64le
linux/mipsle
linux/ppc64
linux/ppc64le
linux/riscv64
linux/s390x
netbsd/386
netbsd/amd64
netbsd/arm
netbsd/arm64
openbsd/386
openbsd/amd64
openbsd/arm
openbsd/arm64
plan9/386
plan9/amd64
plan9/arm
solaris/amd64
wasip1/wasm
windows/386
windows/amd64
windows/arm
windows/arm64
ビルドする際、GOOS
, GOARCH
で環境を指定します。
M1以降のMacOSの場合以下のようになります。
GOOS=darwin GOARCH=arm64 go build .
環境変数を指定してビルドを実行してみます。
実行環境はM1 Macです。
main.go
package main
import "fmt"
func main() {
fmt.Println("Hello, World!")
}
$ GOOS=darwin GOARCH=arm64 go build .
$ ./main
Hello, World!
次に、linux用のビルドし、MacOSでの実行を試してみます。
$ GOOS=linux GOARCH=amd64 go build .
$ ./main
-bash: ./main: cannot execute binary file
Docker上のLinux環境で試してみる
ubuntu環境に先程ビルドしたバイナリをコピーして実行してみます。
FROM ubuntu:latest
WORKDIR /app
COPY ./main .
ENTRYPOINT [ "./main" ]
実行します。
$ docker build -t go_exec_on_ubuntu .
$ docker run -it go_exec_on_ubuntu
Hello, World!
良さそうです。