2つあります。
Alpine Linux には最小限のライブラリしか入っていないため、そのままではバイナリが動作しません。 builder コンテナで ldd すると次の結果が得られます。
# ldd $(which protoc)
/lib64/ld-linux-x86-64.so.2 (0x7f7f183d2000)
libpthread.so.0 => /lib64/ld-linux-x86-64.so.2 (0x7f7f183d2000)
libm.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f7f183d2000)
Error loading shared library libstdc++.so.6: No such file or directory (needed by /usr/local/bin/protoc)
Error loading shared library libgcc_s.so.1: No such file or directory (needed by /usr/local/bin/protoc)
libc.so.6 => /lib64/ld-linux-x86-64.so.2 (0x7f7f183d2000)
このように No such file or directory
が出ています。
よって libstdc++
および libgcc
をインストールするとすべてリンクされた状態になりますが、まだ動作しません。
Alpine Linux の libc が musl であり、挙動の違いによって動作していないのではないかと考えられます。
よって Alpine Linux Wiki の Running glibc programs を参考に gcompat
を追加すると実行できるようになります。
共有ライブラリを正しくインストールできているとしても、Go 向けの protoc 生成には protoc-gen-go が必要です。 例えば https://protobuf.dev/overview/ であったり Quick Start https://grpc.io/docs/languages/go/quickstart/ を見るとよいです。
もともとの Dockerfile を次のように変更します。
7a8,9
> RUN go install google.golang.org/protobuf/cmd/[email protected] && \\
> go install google.golang.org/grpc/cmd/[email protected]
11c13,14
< COPY --from=dl /download/protobuf/bin /usr/local/bin/
---
> RUN apk add --no-cache libstdc++ libgcc gcompat
> COPY --from=dl /go/bin /download/protobuf/bin /usr/local/bin/