alpine에서 google-protobuf사용시 grpc BUG Segmentation fault at에러

Posted by negabaro kim on Saturday, December 24, 2022 Tags: rails gem   1 minute read

문제

rails에서 firestore연동시 사용했던 gem(아마 google-datastore)의 의존성gem으로 google-protobuf 가 있는데 이녀석 같은경우 c libaray 공유오브젝트를 사용해서 apline과 상성이 좋지 않다.

apline에서 사용시 ld- 세그맨트 버그로 시스템이 떨어지는 문제가 발생함.

에러내용:

[BUG] Segmentation fault at 0x000000000005f6e6 ruby 2.7.1p83 (2020-03-31 revision a0c7c23c9c) [x86_64-linux-musl]  grpc

원인

alpine은 GNU C Library를 사용하지 않는데 gem중에 google-protobuf가 x86_64 공유 오브젝트와의 의존성이 강함

해결방법

alpine을 버린다.

grpc와 google-protobuf을 Alpine Linux환경용으로 소스 빌드시킨다.

bundle시스템에는 BUNDLE_FORCE_RUBY_PLATFORM 환경변수가 존재해 이 값을 1로 하면 소스빌드함.

해결

필자의 경우 Dockerfile에 아래와 같이 기술해서 해결

apk add --no-cache gcompat
bundle config set --local force_ruby_platform true
bundle config build.grpc --with-cflags=-D__va_copy=va_copy
bundle config build.google-protobuf --with-cflags=-D__va_copy=va_copy
bundle install --force (or bundle install)

참고

메모

필자의 경우 gax,datastore의 경우 손대지 않았는데 google-gax , google-protobuf , google-cloud-datastore셋다 소스빌드해서 해결했다는 글도 있었음.

google-gax , google-protobuf , google-cloud-datastore の三つについても、 BUNDLE_FORCE_RUBY_PLATFORM を用いてプラットフォームに依存しない強制的なインストールを行う必要がありました。