Pathee engineering blog

世界をしなやかに変えるエンジニアたちのブログ

【Golang】Goaのv3を使う - コンテナイメージの作成

こんにちは。エンジニアの土田です。

スクラム導入のためにやっていたスクラムマスター業も落ち着いてきたので、最近はエンジニアリング側に力を割けるようになってきました。

pathee.hatenablog.com

今はGolangでのAPIサービスの実装を検討をしていて、Goaというフレームワークが用途に合っていそうだったので、使い方を調べています。

GoaでAPIを作成する

f:id:pathee:20190821205151p:plain

GoaはAPI仕様をコードで定義し、それを元にコード生成をして、必要なロジックを実装していくタイプのAPIフレームワークです。

goa.design

このフレームワークは、公式でマイクロサービス向けを謳っている通り、APIでのコミュニケーションが多くなるシステムで必要となってくる、

  • Swagger定義
  • gRPC(Protocol Buffers)

などの面倒を、API仕様を書くだけで同時に見てくれます。

Goa用コンテナイメージ

動作を試してみようとしたところ、準備がそこそこ必要だったので、 公式の入門相当のことが実行できるDockerfileを用意しました。

以下は『goa-sampleのプロジェクトルートにはmakefileとgo.modがあって、sampleというAPIサービスをビルドする』という想定のDockerfileです。

公式の入門を行った場合は、バイナリとしてcalcとcalc-cliができると思います。

FROM golang:1.12 AS api-builder

RUN apt-get update && \
  apt-get install -y git unzip && \
  apt-get clean && rm -rf /var/lib/apt/lists/*

ENV GO111MODULE on
RUN go get -u goa.design/goa/v3/cmd/goa

# install protoc
ARG PROTOC_VER="3.9.1"
RUN mkdir /protoc
ADD https://github.com/protocolbuffers/protobuf/releases/download/v${PROTOC_VER}/protoc-${PROTOC_VER}-linux-x86_64.zip /protoc
WORKDIR /protoc
RUN unzip protoc-${PROTOC_VER}-linux-x86_64.zip && \
  mkdir -p /usr/local/protoc && \
  cp -r bin /usr/local/protoc && \
  chmod 644 -R /usr/local/protoc && \
  chmod 755 /usr/local/protoc/bin/* && \
  cp -r include/google /usr/local/include && \
  chmod 644 -R /usr/local/include/google
ENV PATH $PATH:/usr/local/protoc/bin
WORKDIR /
RUN rm -rf /protoc

RUN go get -u github.com/golang/protobuf/protoc-gen-go

WORKDIR /go/src/goa-sample
COPY . .
RUN make


FROM alpine AS api-server

EXPOSE 8000
COPY --from=api-builder /go/src/goa-sample/sample .

マルチステージビルドにしていますが、開発用コンテナだけでよければ、

docker build --target api-builder -t api-builder .

といった感じでイメージを作成すると使いやすいのではないでしょうか。

Goa v3での使い方

今回調べていると、Goにmodulesが実装された1.11以降、Goaのバージョンが上がってv3になり、 既存のGoaのインストールとはちょっと変わったところが出ていたので、 それらに対応したコンテナイメージを作ってみました。

Goa自体の仕組みや実装方法については触れずじまいでしたが、調査が進んで情報が整理できたら、またネタにするようにします。