Go+DockerをRaspberry Pi にデプロイ

ここを書いている途中に得られた知見のまとめ

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じゃないの・・・・

以上

Licensed under CC BY-NC-ND 4.0
Built with Hugo
テーマ StackJimmy によって設計されています。