Hi! At work, we've been working hard to migrate most of our applications to Google Cloud Platform, initially running in Docker in Compute Engine, and eventually migrating to Container Engine. Like many other folks who are using Docker, we've landed on Alpine Linux as our preferred base image.
Much of the new infrastructure we're building will be communicating via Pub/Sub, and so pretty much all of these apps will be using the google-cloud-pubsub gem as a dependency.
Unfortunately, that's turned out to pose a problem in our base image of choice, because of a number of issues with dependencies pulled in by google-cloud-pubsub.
Initially, we ran into issues linking against google-protobuf 3.2.0.1. I'd hoped to solve this by building, but ran into the issue I shared here. It was a dependency on glibc, when Alpine uses musl libc. I resolved this by going back to 3.2.0, and @acozzette has since resolved the issue with building. However, he's raised a valid point that it might be worth looking into ways to allow the published, prebuilt gem to work out of the box.
Now, I'm personally just fine with building the gem's native extensions, so I proceeded along, thinking I'd managed to resolve the issue that was dooming our devs to a life of slim images.
And then I found out about grpc.
Gory build failure inside...
Gem::Ext::BuildError: ERROR: Failed to build gem native extension.
current directory:
/opt/app/vendor/bundle-development/gems/grpc-1.2.0/src/ruby/ext/grpc
/usr/local/bin/ruby -r ./siteconf20170322-7-odtrys.rb extconf.rb
Building internal gRPC into
/opt/app/vendor/bundle-development/gems/grpc-1.2.0/src/ruby/ext/grpc/libs/opt
make: Entering directory '/opt/app/vendor/bundle-development/gems/grpc-1.2.0'
[C] Compiling third_party/zlib/adler32.c
[C] Compiling third_party/zlib/compress.c
[C] Compiling third_party/zlib/crc32.c
[C] Compiling third_party/zlib/deflate.c
[C] Compiling third_party/zlib/gzclose.c
[C] Compiling third_party/zlib/gzlib.c
[C] Compiling third_party/zlib/gzwrite.c
[C] Compiling third_party/zlib/gzread.c
[C] Compiling third_party/zlib/infback.c
[C] Compiling third_party/zlib/inffast.c
[C] Compiling third_party/zlib/inflate.c
[C] Compiling third_party/zlib/inftrees.c
[C] Compiling third_party/zlib/trees.c
[C] Compiling third_party/zlib/uncompr.c
[C] Compiling third_party/zlib/zutil.c
[C] Compiling src/boringssl/err_data.c
[C] Compiling third_party/boringssl/crypto/aes/aes.c
[C] Compiling third_party/boringssl/crypto/aes/mode_wrappers.c
[C] Compiling third_party/boringssl/crypto/asn1/a_bitstr.c
[C] Compiling third_party/boringssl/crypto/asn1/a_bool.c
[C] Compiling third_party/boringssl/crypto/asn1/a_d2i_fp.c
[C] Compiling third_party/boringssl/crypto/asn1/a_dup.c
[C] Compiling third_party/boringssl/crypto/asn1/a_enum.c
[C] Compiling third_party/boringssl/crypto/asn1/a_gentm.c
[C] Compiling third_party/boringssl/crypto/asn1/a_i2d_fp.c
[C] Compiling third_party/boringssl/crypto/asn1/a_int.c
[C] Compiling third_party/boringssl/crypto/asn1/a_mbstr.c
[C] Compiling third_party/boringssl/crypto/asn1/a_octet.c
[C] Compiling third_party/boringssl/crypto/asn1/a_object.c
[C] Compiling third_party/boringssl/crypto/asn1/a_print.c
[C] Compiling third_party/boringssl/crypto/asn1/a_strnid.c
[C] Compiling third_party/boringssl/crypto/asn1/a_time.c
[C] Compiling third_party/boringssl/crypto/asn1/a_type.c
[C] Compiling third_party/boringssl/crypto/asn1/a_utctm.c
[C] Compiling third_party/boringssl/crypto/asn1/a_utf8.c
[C] Compiling third_party/boringssl/crypto/asn1/asn1_lib.c
[C] Compiling third_party/boringssl/crypto/asn1/asn1_par.c
[C] Compiling third_party/boringssl/crypto/asn1/asn_pack.c
[C] Compiling third_party/boringssl/crypto/asn1/f_enum.c
[C] Compiling third_party/boringssl/crypto/asn1/f_int.c
[C] Compiling third_party/boringssl/crypto/asn1/t_bitst.c
[C] Compiling third_party/boringssl/crypto/asn1/f_string.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_dec.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_enc.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_fre.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_new.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_typ.c
[C] Compiling third_party/boringssl/crypto/asn1/x_bignum.c
[C] Compiling third_party/boringssl/crypto/asn1/tasn_utl.c
[C] Compiling third_party/boringssl/crypto/asn1/x_long.c
[C] Compiling third_party/boringssl/crypto/bio/bio.c
[C] Compiling third_party/boringssl/crypto/base64/base64.c
[C] Compiling third_party/boringssl/crypto/bio/bio_mem.c
[C] Compiling third_party/boringssl/crypto/bio/buffer.c
[C] Compiling third_party/boringssl/crypto/bio/connect.c
[C] Compiling third_party/boringssl/crypto/bio/fd.c
[C] Compiling third_party/boringssl/crypto/bio/file.c
[C] Compiling third_party/boringssl/crypto/bio/hexdump.c
[C] Compiling third_party/boringssl/crypto/bio/pair.c
[C] Compiling third_party/boringssl/crypto/bio/printf.c
[C] Compiling third_party/boringssl/crypto/bio/socket.c
[C] Compiling third_party/boringssl/crypto/bio/socket_helper.c
[C] Compiling third_party/boringssl/crypto/bn/add.c
[C] Compiling third_party/boringssl/crypto/bn/asm/x86_64-gcc.c
[C] Compiling third_party/boringssl/crypto/bn/bn.c
[C] Compiling third_party/boringssl/crypto/bn/bn_asn1.c
[C] Compiling third_party/boringssl/crypto/bn/cmp.c
[C] Compiling third_party/boringssl/crypto/bn/convert.c
[C] Compiling third_party/boringssl/crypto/bn/ctx.c
[C] Compiling third_party/boringssl/crypto/bn/div.c
[C] Compiling third_party/boringssl/crypto/bn/exponentiation.c
[C] Compiling third_party/boringssl/crypto/bn/gcd.c
[C] Compiling third_party/boringssl/crypto/bn/generic.c
[C] Compiling third_party/boringssl/crypto/bn/kronecker.c
[C] Compiling third_party/boringssl/crypto/bn/montgomery.c
[C] Compiling third_party/boringssl/crypto/bn/montgomery_inv.c
[C] Compiling third_party/boringssl/crypto/bn/mul.c
[C] Compiling third_party/boringssl/crypto/bn/prime.c
[C] Compiling third_party/boringssl/crypto/bn/random.c
[C] Compiling third_party/boringssl/crypto/bn/rsaz_exp.c
[C] Compiling third_party/boringssl/crypto/bn/shift.c
[C] Compiling third_party/boringssl/crypto/bn/sqrt.c
[C] Compiling third_party/boringssl/crypto/buf/buf.c
[C] Compiling third_party/boringssl/crypto/bytestring/asn1_compat.c
[C] Compiling third_party/boringssl/crypto/bytestring/ber.c
[C] Compiling third_party/boringssl/crypto/bytestring/cbb.c
[C] Compiling third_party/boringssl/crypto/bytestring/cbs.c
[C] Compiling third_party/boringssl/crypto/chacha/chacha.c
[C] Compiling third_party/boringssl/crypto/cipher/aead.c
[C] Compiling third_party/boringssl/crypto/cipher/cipher.c
[C] Compiling third_party/boringssl/crypto/cipher/derive_key.c
[C] Compiling third_party/boringssl/crypto/cipher/e_aes.c
[C] Compiling third_party/boringssl/crypto/cipher/e_chacha20poly1305.c
[C] Compiling third_party/boringssl/crypto/cipher/e_des.c
[C] Compiling third_party/boringssl/crypto/cipher/e_rc2.c
[C] Compiling third_party/boringssl/crypto/cipher/e_null.c
[C] Compiling third_party/boringssl/crypto/cipher/e_rc4.c
[C] Compiling third_party/boringssl/crypto/cipher/e_ssl3.c
[C] Compiling third_party/boringssl/crypto/cipher/e_tls.c
[C] Compiling third_party/boringssl/crypto/cipher/tls_cbc.c
[C] Compiling third_party/boringssl/crypto/cmac/cmac.c
[C] Compiling third_party/boringssl/crypto/conf/conf.c
[C] Compiling third_party/boringssl/crypto/cpu-aarch64-linux.c
[C] Compiling third_party/boringssl/crypto/cpu-arm-linux.c
[C] Compiling third_party/boringssl/crypto/cpu-arm.c
[C] Compiling third_party/boringssl/crypto/cpu-intel.c
[C] Compiling third_party/boringssl/crypto/cpu-ppc64le.c
[C] Compiling third_party/boringssl/crypto/crypto.c
[C] Compiling third_party/boringssl/crypto/curve25519/curve25519.c
[C] Compiling third_party/boringssl/crypto/curve25519/spake25519.c
[C] Compiling third_party/boringssl/crypto/curve25519/x25519-x86_64.c
[C] Compiling third_party/boringssl/crypto/des/des.c
[C] Compiling third_party/boringssl/crypto/dh/check.c
[C] Compiling third_party/boringssl/crypto/dh/dh.c
[C] Compiling third_party/boringssl/crypto/dh/dh_asn1.c
[C] Compiling third_party/boringssl/crypto/dh/params.c
[C] Compiling third_party/boringssl/crypto/digest/digest.c
[C] Compiling third_party/boringssl/crypto/digest/digests.c
[C] Compiling third_party/boringssl/crypto/dsa/dsa.c
[C] Compiling third_party/boringssl/crypto/dsa/dsa_asn1.c
[C] Compiling third_party/boringssl/crypto/ec/ec.c
[C] Compiling third_party/boringssl/crypto/ec/ec_asn1.c
[C] Compiling third_party/boringssl/crypto/ec/ec_key.c
[C] Compiling third_party/boringssl/crypto/ec/ec_montgomery.c
[C] Compiling third_party/boringssl/crypto/ec/oct.c
[C] Compiling third_party/boringssl/crypto/ec/p224-64.c
[C] Compiling third_party/boringssl/crypto/ec/p256-64.c
[C] Compiling third_party/boringssl/crypto/ec/p256-x86_64.c
[C] Compiling third_party/boringssl/crypto/ec/simple.c
[C] Compiling third_party/boringssl/crypto/ec/util-64.c
[C] Compiling third_party/boringssl/crypto/ec/wnaf.c
[C] Compiling third_party/boringssl/crypto/ecdh/ecdh.c
[C] Compiling third_party/boringssl/crypto/ecdsa/ecdsa.c
[C] Compiling third_party/boringssl/crypto/ecdsa/ecdsa_asn1.c
[C] Compiling third_party/boringssl/crypto/engine/engine.c
[C] Compiling third_party/boringssl/crypto/err/err.c
[C] Compiling third_party/boringssl/crypto/evp/digestsign.c
[C] Compiling third_party/boringssl/crypto/evp/evp.c
[C] Compiling third_party/boringssl/crypto/evp/evp_asn1.c
[C] Compiling third_party/boringssl/crypto/evp/evp_ctx.c
[C] Compiling third_party/boringssl/crypto/evp/p_dsa_asn1.c
[C] Compiling third_party/boringssl/crypto/evp/p_ec.c
[C] Compiling third_party/boringssl/crypto/evp/p_ec_asn1.c
[C] Compiling third_party/boringssl/crypto/evp/p_rsa.c
[C] Compiling third_party/boringssl/crypto/evp/p_rsa_asn1.c
[C] Compiling third_party/boringssl/crypto/evp/pbkdf.c
[C] Compiling third_party/boringssl/crypto/evp/print.c
[C] Compiling third_party/boringssl/crypto/evp/sign.c
[C] Compiling third_party/boringssl/crypto/ex_data.c
[C] Compiling third_party/boringssl/crypto/hkdf/hkdf.c
[C] Compiling third_party/boringssl/crypto/hmac/hmac.c
[C] Compiling third_party/boringssl/crypto/lhash/lhash.c
[C] Compiling third_party/boringssl/crypto/md4/md4.c
[C] Compiling third_party/boringssl/crypto/md5/md5.c
[C] Compiling third_party/boringssl/crypto/mem.c
[C] Compiling third_party/boringssl/crypto/modes/cbc.c
[C] Compiling third_party/boringssl/crypto/modes/cfb.c
[C] Compiling third_party/boringssl/crypto/modes/ctr.c
[C] Compiling third_party/boringssl/crypto/modes/gcm.c
[C] Compiling third_party/boringssl/crypto/modes/ofb.c
[C] Compiling third_party/boringssl/crypto/newhope/error_correction.c
[C] Compiling third_party/boringssl/crypto/newhope/newhope.c
[C] Compiling third_party/boringssl/crypto/newhope/poly.c
[C] Compiling third_party/boringssl/crypto/newhope/ntt.c
[C] Compiling third_party/boringssl/crypto/newhope/precomp.c
[C] Compiling third_party/boringssl/crypto/newhope/reduce.c
[C] Compiling third_party/boringssl/crypto/obj/obj.c
[C] Compiling third_party/boringssl/crypto/obj/obj_xref.c
[C] Compiling third_party/boringssl/crypto/pem/pem_all.c
[C] Compiling third_party/boringssl/crypto/pem/pem_info.c
[C] Compiling third_party/boringssl/crypto/pem/pem_lib.c
[C] Compiling third_party/boringssl/crypto/pem/pem_oth.c
[C] Compiling third_party/boringssl/crypto/pem/pem_pk8.c
[C] Compiling third_party/boringssl/crypto/pem/pem_pkey.c
[C] Compiling third_party/boringssl/crypto/pem/pem_x509.c
[C] Compiling third_party/boringssl/crypto/pem/pem_xaux.c
[C] Compiling third_party/boringssl/crypto/pkcs8/p5_pbe.c
[C] Compiling third_party/boringssl/crypto/pkcs8/p5_pbev2.c
[C] Compiling third_party/boringssl/crypto/pkcs8/p8_pkey.c
[C] Compiling third_party/boringssl/crypto/pkcs8/pkcs8.c
[C] Compiling third_party/boringssl/crypto/poly1305/poly1305.c
[C] Compiling third_party/boringssl/crypto/poly1305/poly1305_arm.c
[C] Compiling third_party/boringssl/crypto/poly1305/poly1305_vec.c
[C] Compiling third_party/boringssl/crypto/rand/deterministic.c
[C] Compiling third_party/boringssl/crypto/rand/rand.c
[C] Compiling third_party/boringssl/crypto/rand/urandom.c
[C] Compiling third_party/boringssl/crypto/rand/windows.c
[C] Compiling third_party/boringssl/crypto/rc4/rc4.c
[C] Compiling third_party/boringssl/crypto/refcount_c11.c
[C] Compiling third_party/boringssl/crypto/refcount_lock.c
[C] Compiling third_party/boringssl/crypto/rsa/blinding.c
[C] Compiling third_party/boringssl/crypto/rsa/padding.c
[C] Compiling third_party/boringssl/crypto/rsa/rsa.c
[C] Compiling third_party/boringssl/crypto/rsa/rsa_asn1.c
[C] Compiling third_party/boringssl/crypto/rsa/rsa_impl.c
[C] Compiling third_party/boringssl/crypto/sha/sha1.c
[C] Compiling third_party/boringssl/crypto/sha/sha256.c
[C] Compiling third_party/boringssl/crypto/sha/sha512.c
[C] Compiling third_party/boringssl/crypto/stack/stack.c
[C] Compiling third_party/boringssl/crypto/thread.c
[C] Compiling third_party/boringssl/crypto/thread_none.c
[C] Compiling third_party/boringssl/crypto/thread_pthread.c
[C] Compiling third_party/boringssl/crypto/thread_win.c
[C] Compiling third_party/boringssl/crypto/time_support.c
[C] Compiling third_party/boringssl/crypto/x509/a_digest.c
[C] Compiling third_party/boringssl/crypto/x509/a_sign.c
[C] Compiling third_party/boringssl/crypto/x509/a_strex.c
[C] Compiling third_party/boringssl/crypto/x509/a_verify.c
[C] Compiling third_party/boringssl/crypto/x509/algorithm.c
[C] Compiling third_party/boringssl/crypto/x509/asn1_gen.c
[C] Compiling third_party/boringssl/crypto/x509/by_dir.c
[C] Compiling third_party/boringssl/crypto/x509/by_file.c
[C] Compiling third_party/boringssl/crypto/x509/i2d_pr.c
[C] Compiling third_party/boringssl/crypto/x509/pkcs7.c
[C] Compiling third_party/boringssl/crypto/x509/rsa_pss.c
[C] Compiling third_party/boringssl/crypto/x509/t_crl.c
[C] Compiling third_party/boringssl/crypto/x509/t_req.c
[C] Compiling third_party/boringssl/crypto/x509/t_x509.c
[C] Compiling third_party/boringssl/crypto/x509/t_x509a.c
[C] Compiling third_party/boringssl/crypto/x509/x509.c
[C] Compiling third_party/boringssl/crypto/x509/x509_att.c
[C] Compiling third_party/boringssl/crypto/x509/x509_cmp.c
[C] Compiling third_party/boringssl/crypto/x509/x509_d2.c
[C] Compiling third_party/boringssl/crypto/x509/x509_def.c
[C] Compiling third_party/boringssl/crypto/x509/x509_ext.c
[C] Compiling third_party/boringssl/crypto/x509/x509_lu.c
[C] Compiling third_party/boringssl/crypto/x509/x509_obj.c
[C] Compiling third_party/boringssl/crypto/x509/x509_r2x.c
[C] Compiling third_party/boringssl/crypto/x509/x509_req.c
[C] Compiling third_party/boringssl/crypto/x509/x509_set.c
[C] Compiling third_party/boringssl/crypto/x509/x509_trs.c
[C] Compiling third_party/boringssl/crypto/x509/x509_txt.c
[C] Compiling third_party/boringssl/crypto/x509/x509_v3.c
[C] Compiling third_party/boringssl/crypto/x509/x509_vfy.c
[C] Compiling third_party/boringssl/crypto/x509/x509_vpm.c
[C] Compiling third_party/boringssl/crypto/x509/x509cset.c
[C] Compiling third_party/boringssl/crypto/x509/x509name.c
[C] Compiling third_party/boringssl/crypto/x509/x509rset.c
[C] Compiling third_party/boringssl/crypto/x509/x509spki.c
[C] Compiling third_party/boringssl/crypto/x509/x_algor.c
[C] Compiling third_party/boringssl/crypto/x509/x509type.c
[C] Compiling third_party/boringssl/crypto/x509/x_all.c
[C] Compiling third_party/boringssl/crypto/x509/x_attrib.c
[C] Compiling third_party/boringssl/crypto/x509/x_crl.c
[C] Compiling third_party/boringssl/crypto/x509/x_exten.c
[C] Compiling third_party/boringssl/crypto/x509/x_info.c
[C] Compiling third_party/boringssl/crypto/x509/x_name.c
[C] Compiling third_party/boringssl/crypto/x509/x_pkey.c
[C] Compiling third_party/boringssl/crypto/x509/x_pubkey.c
[C] Compiling third_party/boringssl/crypto/x509/x_req.c
[C] Compiling third_party/boringssl/crypto/x509/x_sig.c
[C] Compiling third_party/boringssl/crypto/x509/x_spki.c
[C] Compiling third_party/boringssl/crypto/x509/x_val.c
[C] Compiling third_party/boringssl/crypto/x509/x_x509.c
[C] Compiling third_party/boringssl/crypto/x509/x_x509a.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_cache.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_data.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_lib.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_map.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_node.c
[C] Compiling third_party/boringssl/crypto/x509v3/pcy_tree.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_akey.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_akeya.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_bcons.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_alt.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_bitst.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_conf.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_cpols.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_crld.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_enum.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_extku.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_genn.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_ia5.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_info.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_int.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_lib.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_ncons.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_pci.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_pcia.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_pcons.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_pku.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_pmaps.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_prn.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_purp.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_skey.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_sxnet.c
[C] Compiling third_party/boringssl/crypto/x509v3/v3_utl.c
[C] Compiling third_party/boringssl/ssl/custom_extensions.c
[C] Compiling third_party/boringssl/ssl/d1_both.c
[C] Compiling third_party/boringssl/ssl/d1_lib.c
[C] Compiling third_party/boringssl/ssl/d1_pkt.c
[C] Compiling third_party/boringssl/ssl/d1_srtp.c
[C] Compiling third_party/boringssl/ssl/dtls_method.c
[C] Compiling third_party/boringssl/ssl/dtls_record.c
[C] Compiling third_party/boringssl/ssl/handshake_client.c
[C] Compiling third_party/boringssl/ssl/handshake_server.c
[C] Compiling third_party/boringssl/ssl/s3_both.c
[C] Compiling third_party/boringssl/ssl/s3_enc.c
[C] Compiling third_party/boringssl/ssl/s3_lib.c
[C] Compiling third_party/boringssl/ssl/s3_pkt.c
[C] Compiling third_party/boringssl/ssl/ssl_aead_ctx.c
[C] Compiling third_party/boringssl/ssl/ssl_asn1.c
[C] Compiling third_party/boringssl/ssl/ssl_buffer.c
[C] Compiling third_party/boringssl/ssl/ssl_cert.c
[C] Compiling third_party/boringssl/ssl/ssl_cipher.c
[C] Compiling third_party/boringssl/ssl/ssl_ecdh.c
[C] Compiling third_party/boringssl/ssl/ssl_file.c
[C] Compiling third_party/boringssl/ssl/ssl_lib.c
[C] Compiling third_party/boringssl/ssl/ssl_rsa.c
[C] Compiling third_party/boringssl/ssl/ssl_session.c
[C] Compiling third_party/boringssl/ssl/ssl_stat.c
[C] Compiling third_party/boringssl/ssl/t1_enc.c
[C] Compiling third_party/boringssl/ssl/t1_lib.c
[C] Compiling third_party/boringssl/ssl/tls13_both.c
[C] Compiling third_party/boringssl/ssl/tls13_client.c
[C] Compiling third_party/boringssl/ssl/tls13_enc.c
[C] Compiling third_party/boringssl/ssl/tls13_server.c
[C] Compiling third_party/boringssl/ssl/tls_method.c
[C] Compiling third_party/boringssl/ssl/tls_record.c
[C] Compiling src/core/lib/surface/init.c
[C] Compiling src/core/lib/channel/channel_args.c
[C] Compiling src/core/lib/channel/channel_stack.c
[C] Compiling src/core/lib/channel/channel_stack_builder.c
[C] Compiling src/core/lib/channel/compress_filter.c
[C] Compiling src/core/lib/channel/connected_channel.c
[C] Compiling src/core/lib/channel/deadline_filter.c
[C] Compiling src/core/lib/channel/handshaker.c
[C] Compiling src/core/lib/channel/handshaker_factory.c
[C] Compiling src/core/lib/channel/handshaker_registry.c
[C] Compiling src/core/lib/channel/http_client_filter.c
[C] Compiling src/core/lib/channel/http_server_filter.c
[C] Compiling src/core/lib/channel/message_size_filter.c
[C] Compiling src/core/lib/compression/compression.c
[C] Compiling src/core/lib/compression/message_compress.c
[C] Compiling src/core/lib/debug/trace.c
[C] Compiling src/core/lib/http/format_request.c
[C] Compiling src/core/lib/http/httpcli.c
[C] Compiling src/core/lib/http/parser.c
[C] Compiling src/core/lib/iomgr/closure.c
[C] Compiling src/core/lib/iomgr/combiner.c
[C] Compiling src/core/lib/iomgr/endpoint.c
[C] Compiling src/core/lib/iomgr/endpoint_pair_posix.c
[C] Compiling src/core/lib/iomgr/endpoint_pair_uv.c
[C] Compiling src/core/lib/iomgr/endpoint_pair_windows.c
[C] Compiling src/core/lib/iomgr/error.c
[C] Compiling src/core/lib/iomgr/ev_epoll_linux.c
[C] Compiling src/core/lib/iomgr/ev_poll_posix.c
[C] Compiling src/core/lib/iomgr/ev_posix.c
[C] Compiling src/core/lib/iomgr/exec_ctx.c
[C] Compiling src/core/lib/iomgr/executor.c
[C] Compiling src/core/lib/iomgr/iocp_windows.c
[C] Compiling src/core/lib/iomgr/iomgr.c
[C] Compiling src/core/lib/iomgr/iomgr_posix.c
[C] Compiling src/core/lib/iomgr/iomgr_uv.c
[C] Compiling src/core/lib/iomgr/iomgr_windows.c
[C] Compiling src/core/lib/iomgr/load_file.c
[C] Compiling src/core/lib/iomgr/network_status_tracker.c
[C] Compiling src/core/lib/iomgr/polling_entity.c
[C] Compiling src/core/lib/iomgr/pollset_set_uv.c
[C] Compiling src/core/lib/iomgr/pollset_set_windows.c
[C] Compiling src/core/lib/iomgr/pollset_uv.c
[C] Compiling src/core/lib/iomgr/pollset_windows.c
[C] Compiling src/core/lib/iomgr/resolve_address_posix.c
[C] Compiling src/core/lib/iomgr/resolve_address_uv.c
[C] Compiling src/core/lib/iomgr/sockaddr_utils.c
[C] Compiling src/core/lib/iomgr/resolve_address_windows.c
[C] Compiling src/core/lib/iomgr/resource_quota.c
[C] Compiling src/core/lib/iomgr/socket_mutator.c
[C] Compiling src/core/lib/iomgr/socket_utils_common_posix.c
[C] Compiling src/core/lib/iomgr/socket_utils_linux.c
[C] Compiling src/core/lib/iomgr/socket_utils_posix.c
[C] Compiling src/core/lib/iomgr/socket_utils_uv.c
[C] Compiling src/core/lib/iomgr/socket_utils_windows.c
[C] Compiling src/core/lib/iomgr/socket_windows.c
[C] Compiling src/core/lib/iomgr/tcp_client_posix.c
[C] Compiling src/core/lib/iomgr/tcp_client_uv.c
[C] Compiling src/core/lib/iomgr/tcp_client_windows.c
[C] Compiling src/core/lib/iomgr/tcp_posix.c
[C] Compiling src/core/lib/iomgr/tcp_server_posix.c
[C] Compiling src/core/lib/iomgr/tcp_server_uv.c
[C] Compiling src/core/lib/iomgr/tcp_server_windows.c
[C] Compiling src/core/lib/iomgr/tcp_uv.c
[C] Compiling src/core/lib/iomgr/tcp_windows.c
[C] Compiling src/core/lib/iomgr/time_averaged_stats.c
[C] Compiling src/core/lib/iomgr/timer_generic.c
[C] Compiling src/core/lib/iomgr/timer_heap.c
[C] Compiling src/core/lib/iomgr/timer_uv.c
[C] Compiling src/core/lib/iomgr/udp_server.c
[C] Compiling src/core/lib/iomgr/unix_sockets_posix.c
src/core/lib/iomgr/tcp_posix.c: In function 'tcp_do_read':
src/core/lib/iomgr/tcp_posix.c:219:20: error: conversion to 'int' from
'msg_iovlen_type {aka long unsigned int}' may alter its value
[-Werror=conversion]
msg.msg_iovlen = tcp->iov_size;
^
src/core/lib/iomgr/tcp_posix.c: In function 'tcp_flush':
src/core/lib/iomgr/tcp_posix.c:364:22: error: conversion to 'int' from
'msg_iovlen_type {aka long unsigned int}' may alter its value
[-Werror=conversion]
msg.msg_iovlen = iov_size;
^
[C] Compiling src/core/lib/iomgr/unix_sockets_posix_noop.c
[C] Compiling src/core/lib/iomgr/wakeup_fd_cv.c
[C] Compiling src/core/lib/iomgr/wakeup_fd_eventfd.c
cc1: all warnings being treated as errors
Makefile:2364: recipe for target
'/opt/app/vendor/bundle-development/gems/grpc-1.2.0/src/ruby/ext/grpc/objs/opt/src/core/lib/iomgr/tcp_posix.o'
failed
make: ***
[/opt/app/vendor/bundle-development/gems/grpc-1.2.0/src/ruby/ext/grpc/objs/opt/src/core/lib/iomgr/tcp_posix.o]
Error 1
make: *** Waiting for unfinished jobs....
make: Leaving directory '/opt/app/vendor/bundle-development/gems/grpc-1.2.0'
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Provided configuration options:
--with-opt-dir
--without-opt-dir
--with-opt-include
--without-opt-include=${opt-dir}/include
--with-opt-lib
--without-opt-lib=${opt-dir}/lib
--with-make-prog
--without-make-prog
--srcdir=.
--curdir
--ruby=/usr/local/bin/$(RUBY_BASE_NAME)
extconf failed, exit code 1
Gem files will remain installed in
/opt/app/vendor/bundle-development/gems/grpc-1.2.0 for inspection.
Results logged to
/opt/app/vendor/bundle-development/extensions/x86_64-linux/2.3.0/grpc-1.2.0/gem_make.out
An error occurred while installing grpc (1.2.0), and Bundler cannot continue.
Make sure that `gem install grpc -v '1.2.0'` succeeds before bundling.
Error running command. Aborting.
While the glibc dependencies in google-protobuf ended up being pretty
straightforward to work around, it seems like there are more involved issues with grpc. According to grpc/grpc#8899, at least one reported incompatibility (grpc/grpc#6850) has survived for 9 months without a resolution, and the closest workarounds seem to involve using the prebuilt library, installing libc6-compat, and/or installing other compatibility packages pulled down with wget. All of this to install a dependency of a dependency of a dependency.
And none of this helps us build from source, which we're now forcing to work around the issues with protobuf, and would prefer to do in any case, vs using the precompiled gems.
I'm not really sure what I can offer the devs on my team aside from "just switch to slim" -- but I think, given the traction that Alpine has in the Docker space, and Google's bet on containerization in Google Cloud Platform, this would be relevant to Google's interests. At least, I'd hope it is.
I'd ask if it was possible to eliminate the dependency on grpc for google-cloud-pubsub, but I'm fairly sure I know the answer to that, based on its ubiquity in my Gemfile.lock at this point. Either way, I thought it might be a useful bit of feedback to share.
@ernie If I understand this issue correctly, this issue is that you cannot build grpc on Alpine Linux. I don't think we can eliminate 'google-cloud-pubsub's dependency on grpc. So it seems that we cannot resolve the issue at the client-library level.
@swcloud Well, I said I "would ask" -- as in, yeah, I'm aware. But as it sits, we can't use this gem on our choice of platform without being able to link or (ideally) build grpc. Hence raising the issue. :)
@swcloud can we get a bug against the grpc gem so that it can build on Alpine Linux? It seems like we'll run into this more and more as folks move to containers and GKE.
There is already an issue opened for this: grpc/grpc#8899. But it is labeled as an enhancement and not a bug. I would love to see it reclassified as a bug though!
@blowmage Looks like https://github.com/grpc/grpc/issues/8899 has been fixed and released. Does that resolve this issue?
I am working on verifying the latest releases on Arch. I'll close when we have verification.
@blowmage any update on this?
I never got verification. I'll try to verify this myself this week.
ping @blowmage what's the status of this one?
Still haven’t verified. I will try to get it done this week.
@blowmage What would you say we need to do for verification? e.g. do we need a way to run acceptance tests against Alpine (maybe via Docker)? I can look at this as well, as I'm in the middle of putting together customer guidance for using our stuff in containers, and Alpine is a part of that.
I can confirm from my ad-hoc testing that at least the current version of the trace client (which uses grpc) does work on Alpine. It is still necessary to force bundler to build the grpc gem itself by setting BUNDLE_FORCE_RUBY_PLATFORM=1.
I have also been able to install the grpc and google-protobuf gems on Alpine Linux and connect to the Pub/Sub API without issue. The gems perform a compile for native extensions when installed, but everything completes cleanly without warnings or errors. So I am going to close this issue.
If anyone runs into issues with Alpine Linux, please open a new issue with all the relevant information. Thanks all!
Use BUNDLE_FORCE_RUBY_PLATFORM=1
Dockerfile looks like this.
RUN apk update
RUN apk --no-cache add graphicsmagick libc6-compat
ENV APP_HOME /app
RUN mkdir -p $APP_HOME
WORKDIR $APP_HOME
COPY Gemfile Gemfile.lock ./
RUN gem install bundler && BUNDLE_FORCE_RUBY_PLATFORM=1 bundle install --jobs 20 --retry 5
COPY . ./
EXPOSE 3000
CMD ["bundle", "exec", "rails", "server", "-b", "0.0.0.0"]
Hi @trackq, thank you for your helpful comment. I tried it with libc6-compat and BUNDLE_FORCE_RUBY_PLATFORM=1, but now the compilation fails with some error related to boringssl. Did you get it running with the latest versions of Alpine/Ruby/grpc? I'm using:
I don't have boringssl installed, and don't know which steps to take to either install it so that it can be found by the grpc build script or to use libressl instead.
Here is the log output:
[C] Compiling third_party/boringssl/crypto/bio/socket_helper.c
cc1: all warnings being treated as errors
make: *** [Makefile:2901:
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/connect.o]
Error 1
make: *** Waiting for unfinished jobs....
mkdir -p `dirname
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket.o`
mkdir -p `dirname
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket_helper.o`
gcc -Ithird_party/googletest/googletest/include
-Ithird_party/googletest/googlemock/include -Ithird_party/boringssl/include
-Ithird_party/cares -Ithird_party/cares/cares
-Ithird_party/address_sorting/include -DGPR_BACKWARDS_COMPATIBILITY_MODE -g
-Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter
-DOSATOMIC_USE_INLINED=1 -Wno-deprecated-declarations -Ithird_party/nanopb
-DPB_FIELD_32BIT -O2 -Wframe-larger-than=16384 -fPIC -I. -Iinclude
-I/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/gens -DNDEBUG
-DINSTALL_PREFIX=\"/usr/local\" -Ithird_party/zlib
-Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM
-D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -std=c99
-Wsign-conversion -Wconversion -Wno-sign-conversion -Wno-conversion
-Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration
-Wno-unused-variable -Wno-sign-compare -Wno-implicit-fallthrough -MMD -MF
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket.dep
-c -o
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket.o
third_party/boringssl/crypto/bio/socket.c
gcc -Ithird_party/googletest/googletest/include
-Ithird_party/googletest/googlemock/include -Ithird_party/boringssl/include
-Ithird_party/cares -Ithird_party/cares/cares
-Ithird_party/address_sorting/include -DGPR_BACKWARDS_COMPATIBILITY_MODE -g
-Wall -Wextra -Werror -Wno-long-long -Wno-unused-parameter
-DOSATOMIC_USE_INLINED=1 -Wno-deprecated-declarations -Ithird_party/nanopb
-DPB_FIELD_32BIT -O2 -Wframe-larger-than=16384 -fPIC -I. -Iinclude
-I/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/gens -DNDEBUG
-DINSTALL_PREFIX=\"/usr/local\" -Ithird_party/zlib
-Ithird_party/boringssl/include -fvisibility=hidden -DOPENSSL_NO_ASM
-D_GNU_SOURCE -DWIN32_LEAN_AND_MEAN -D_HAS_EXCEPTIONS=0 -DNOMINMAX -std=c99
-Wsign-conversion -Wconversion -Wno-sign-conversion -Wno-conversion
-Wno-unused-value -Wno-unknown-pragmas -Wno-implicit-function-declaration
-Wno-unused-variable -Wno-sign-compare -Wno-implicit-fallthrough -MMD -MF
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket_helper.dep
-c -o
/usr/local/bundle/gems/grpc-1.20.0/src/ruby/ext/grpc/objs/opt/third_party/boringssl/crypto/bio/socket_helper.o
third_party/boringssl/crypto/bio/socket_helper.c
make: Leaving directory '/usr/local/bundle/gems/grpc-1.20.0'
*** extconf.rb failed ***
Could not create Makefile due to some reason, probably lack of necessary
libraries and/or headers. Check the mkmf.log file for more details. You may
need configuration options.
Specifically, I seem to be caught in this situation:
| | grpc | google-protobuf |
|---|---|---|
| without BUNDLE_FORCE_RUBY_PLATFORM | ✅| ❌(install ok, but segfault) |
| with BUNDLE_FORCE_RUBY_PLATFORM | ❌(boringssl compile error) | ✅ |
I think if I could force bundler to use the precompiled version of grpc, while compiling google-protobuf by itself, I'd be settled. But I just can't find a way to convince bundler to do this.
LOL, I think I just found a solution. This seems to work for me:
RUN gem update --system
RUN bundle install
RUN gem uninstall -aIx google-protobuf
RUN gem install --platform ruby google-protobuf
alpine-3.9
ruby-2.6.3p62
google-protobuf-3.7.1
grpc-1.20.0
I did a bit of digging and found that it was due to alpine gcc not being able to compile boringssl library due to function type cast error.
My temporary solution is as follows.
In Gemfile
# platforms :ruby needed to force build native extensions. Else, segfault in alpine
gem 'google-protobuf', platforms: [:ruby]
gem 'grpc', platforms: [:ruby]
Turn [-Wcast-function-type] error to warning during gcc native extension build.
CFLAGS="-Wno-cast-function-type" bundle install
It builds on alpine 3.9 and works fine with the above steps.
It works for me too ! Thank you so much @phonezawphyo
Thanks @phonezawphyo.
This solution worked for me
https://github.com/protocolbuffers/protobuf/issues/2335#issuecomment-579913357
Most helpful comment
I did a bit of digging and found that it was due to alpine gcc not being able to compile boringssl library due to function type cast error.
My temporary solution is as follows.
In Gemfile
Turn [-Wcast-function-type] error to warning during gcc native extension build.
It builds on alpine 3.9 and works fine with the above steps.