문제
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 を用いてプラットフォームに依存しない強制的なインストールを行う必要がありました。