【Docker】Golang 公式イメージで手元のファイルをコンパイルする for Mac
しょうもないことで詰まってしまったのでメモです。一切分からない状態でやろうとするの駄目ですね!
環境
やりたいこと
スクリプト作成
hoge.go
hogehoge と出力するだけのファイル
package main import "fmt" func main() { fmt.Printf("hogehoge\n") }
コンパイル
「カレントディレクトリにあるファイルをコンパイルする」例を実行 → 怒られた
# 今のファイル構成 $ ls hoge.go # コンパイルしてみる $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.16 go build -v # 怒られた Status: Downloaded newer image for golang:1.16 go: go.mod file not found in current directory or any parent directory; see 'go help modules'
解決方法1(実は解決できていない)
go.mod
ファイルがないと駄目だった
# ファイル作る
$ touch go.mod
$ ls
go.mod hoge.go
go.mod
module hoge go 1.16
# もう1回コンパイルしてみる $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp golang:1.16 go build -v hoge # ファイルができた! $ ls go.mod hoge* hoge.go # 実行してみr……できない $ ./hoge -bash: ./hoge: バイナリファイルを実行できません: Exec format error
解決方法2
mac で実行するなら mac 向けのバイナリファイルができるように、環境変数設定しないと駄目だった(参考)
# 失敗作ファイルを一旦削除 $ rm hoge # 環境変数付けてコンパイル $ docker run --rm -v "$PWD":/usr/src/myapp -w /usr/src/myapp -e GOOS=darwin -e GOARCH=amd64 golang:1.16 go build -v hoge # 今度こそファイルができた! $ ls go.mod hoge* hoge.go # 実行してみる → OK $ ./hoge hogehoge