ここを書いている途中に得られた知見のまとめ
Raspberry Pi と他でアーキテクチャが異なる
intelのCPUはamd64という命令セットで出来ている。それでラズパイはarmという命令セット。
いくらDockerのポータビリティが凄いと言っても命令セットが異なってしまえば、叶わず。
それに気づけず、エラーを量産しました。
“exec format error"が出てきたら疑うべきでしょう。
ということで命令セットが異なるアーキテクチャの間で実行する場合は docker build
を行う際に別途環境変数として指定してあげましょう。
以下の例は --build-arg GOARCH="arm"
をラズパイに指定してください。 --build-arg GOARCH="amd64"
は他の環境で動かすときに指定してね
FROM golang:1.12
WORKDIR .
COPY . .
RUN mkdir gopath
ENV GOPATH /go/gopath
#
ARG GOARCH
ENV GOOS=linux GOARCH=$GOARCH GO111MODULE=on
RUN go build main.go
CMD ["./main"]
おまけ
ここからはGo 1.11.2の話なので1.12だと修正されてるかも・・・
gopathが通っているとGo Modulesを動かすことが出来ません。
なのでFROMで指定した後、GOPATHを退避する必要があります。
RUN mkdir gopath
ENV GOPATH /go/gopath
こんな感じでね。
後、
ENV GO111MODULE=on
これを忘れると悲惨なことになるから気をつけようね!
余談ですがGo 1.12でもGo Modulesを使用するときのコマンドは
GO111MODULE=on
となっています。
えっGo112じゃないの・・・・
以上