gRPCのスタブコードを生成するための Dockerfile を作る

以前 PHP 向けに gRPC のスタブコードを生成するための方法についての記事を書きました 。 その中でコードを生成するツールの protoc およびそのプラグインである grpc_php_plugin を Docker を用いて用意する方法を説明しましたが、そのときは最終的に必要になる Dockerfile を貼り付けるだけで終わりにしていました。 上記の記事ではどうやって protocgrpc_php_plugin を用意しているかの説明までしてしまうと記事全体の流れが悪くなってしまうのでそのときは仕方なかったと思いますが、これらのツールをバージョンアップしようとしたときにどうやればいいか思い出せず困ってしまったので今回はその方法についてメモしようと思います。

protoc

前回の記事を見てもらえば分かると思いますが、protoc は alpine のパッケージ管理システム apk で管理されているので apk add するだけでいいです。

grpc_php_plugin

これは apk からは多分落とせないはずなのでソースからビルドしました。 大まかな流れは gRPC の公式ドキュメント に書いてあるのでそれの通りにやっていけばいいだけです。 ただし Docker Image を alpine から作るとビルドに必要なツールがないので apk から落としてくる必要があります。

そうなると何のパッケージを追加すればいいんだよ、となるのですがこればっかりは動かしてみてトライ&エラーしたほうが早いと思います。 $ docker run -it alpine /bin/sh で alpine のコンテナを起動して 公式ドキュメント のビルド手順を動かし、エラーが起きたら必要なものをインストールしていく、といった流れで alpine のベースイメージに何を追加すれば良いかが分かります。 例えば最初に git clone をするので git が必要だ、とか cmake するので cmake が必要だ、とかそんな感じです。 あとは実際にビルドをするときや protoc を実行するときに共有ライブラリが必要になってくるのでそれも適宜インストールしていく感じです。

最終的に

gRPC v1.52.0 では以下のような Dockerfile になりました。

FROM alpine:3.17

RUN apk add --no-cache --allow-untrusted \
    gcc \
    g++ \
    protoc \
    && apk add --virtual=.build-deps --no-cache --allow-untrusted \
    git \
    make \
    cmake \
    && git clone --depth 1 --recurse-submodules --shallow-submodules -j4 -b v1.52.0 https://github.com/grpc/grpc \
    && mkdir -p grpc/cmake/build \
    && cd grpc/cmake/build \
    && cmake ../.. \
    && make grpc_php_plugin \
    && mv grpc_php_plugin /usr/local/bin \
    && apk del .build-deps \
    && apk del *-dev \
    && cd ../../.. \
    && rm -rf grpc \
    && mkdir -p /project

WORKDIR /project