Upgrade to Pro — share decks privately, control downloads, hide ads and more …

DockerでProtobufをコンパイルしたい!

 DockerでProtobufをコンパイルしたい!

このスライドは、traP LT 2022( https://connpass.com/event/242713/ )の発表資料です。
Protocol Buffers (Protobuf)を使ったWebアプリを作る機会がありました。デプロイする際Dockerイメージにビルドする必要があるのですが、Protobuf公式からはProtoc (Protobuf Compiler)が動くイメージが公開されていません。「コンパイルで自動生成されたコードをリポジトリに入れるのは美しくない!」というこだわりを持った僕が、DockerでProtocを動かし、Protoファイルから各種コードのコンパイルを成功させるまでの道のりをお話しします。

logica / Takuto Nagami

March 27, 2022
Tweet

More Decks by logica / Takuto Nagami

Other Decks in Technology

Transcript

  1. より軽量 JSON JSON文字列(text) <-> インメモリデータ(言語によるデータ型) の変換 Protobuf バイナリ <-> インメモリデータ(言語によるデータ型)

    の変換 バイナリへエンコードされる 連想配列のキー名など、最低限の伝達を担保するのに不必要な情報をギリギ リまで削っているので、JSONよりもわずかに軽い
  2. より簡単 / より広域 Protobufは、Proto言語で書かれた定義ファイルから スキーマに対応するクラス・構造体 バイナリへのエンコード・バイナリからのデコードをする関数 を自動生成(コンパイル)して使う(バイナリの中身が共通化される) Protoc(Protobuf Compiler)を使って、数多くの言語実装をコンパイルできる デフォルト

    - C++ / C# / Java / JS / Kotlin / Objective-C / Python / Ruby アドオンを入れると - Go / Dart / C / PHP / Rust / Scala / TSなどなど API通信をする双方のサービスで、どちらも同じProto言語定義からコンパイルす ればよいので、スキーマ駆動な開発がしやすい!
  3. CI / CDワークフロー上でのコンパイル CI 自分の場合 クライアント: TypeScript サーバー: Go GitHub

    Actionsを使う場合、 arduino/setup-protoc が使える 有志が用意してくれた、actions内でProtocバイナリを用意してくれるjob アドオン TSはnpmのパッケージをインストールするだけ Goの場合 go install で入れられる 🎉解決🎉
  4. マルチCPUアーキテクチャサポート 先輩がやっていたので、マルチCPUアーキテクチャ向けにビルドをしていた Actionsの設定 ... - name: Build and push uses:

    docker/build-push-action@v2 with: context: . push: true platforms: linux/amd64, linux/arm64 tags: `タグ名` 結果 > [linux/arm64 builder 8/8] protoc ... protoc: not found
  5. 正解 wget "https://.../protoc-3.19.4-linux-x86_64.zip" の x86_64 でした AMD64向けバイナリだからARM64で動くわけがない > [linux/arm64 builder

    8/8] protoc ... <- 毎回armだったので、arch怪しそうの顔になる protoc: not found CPUアーキテクチャの理解がおざなりなままマルチアーキテクチャ向けビルドを したツケが回ってきた
  6. TARGETARCH ARG (BuildKitを使用している時のみ)あらかじめ定義されたARG変数として使える TARGETPLATFORM ビルド結果のプラットフォーム linux/amd64、 linux/arm/v7、 windows/amd64 など TARGETARCH

    TARGETPLATFORM のアーキテクチャー部分 これ使えば、ビルドするアーキテクチャに合わせて変えられる! ただ、 amd64 / arm64 の形なので x86_64 と aarch_64 に直す必要が
  7. ありがとうございました~ 参考文献 Protocol Buffers - https://developers.google.com/protocol-buffers Alpine Linux 上で gRPC

    を使ってはまった話 - https://qiita.com/takkeybook/items/5eae085d902957f0fe5b "protoc: not found" on an Alpine-based Docker container running Protocol Buffers - https://stackoverflow.com/questions/64447731/protoc-not-found- on-an-alpine-based-docker-container-running-protocol-buffers protoc(Alpine Linux Packages) - https://pkgs.alpinelinux.org/package/edge/main/x86/protoc