sj26 / mailcatcher

Catches mail and serves it through a dream.
http://mailcatcher.me
MIT License
6.23k stars 571 forks source link

Doesn't work on rhel8-like distr in docker with arm arch #533

Closed dolgovas closed 11 months ago

dolgovas commented 1 year ago

Really strange error in docker based on quay.io/centos/centos:stream8 On ARM It seems like

[root@b05b6af9c21b /]# cat /etc/centos-release
CentOS Stream release 8
[root@b05b6af9c21b /]# mailcatcher
Starting MailCatcher v0.8.2
<internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require': cannot load such file -- sqlite3/sqlite3_native (LoadError)
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/sqlite3-1.6.0-aarch64-linux/lib/sqlite3.rb:6:in `rescue in <top (required)>'
    from /usr/local/share/gems/gems/sqlite3-1.6.0-aarch64-linux/lib/sqlite3.rb:2:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher/mail.rb:6:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher/smtp.rb:5:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:183:in `block (2 levels) in run!'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:233:in `rescue_port'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:182:in `block in run!'
    from /usr/local/share/gems/gems/eventmachine-1.0.9.1/lib/eventmachine.rb:193:in `run_machine'
    from /usr/local/share/gems/gems/eventmachine-1.0.9.1/lib/eventmachine.rb:193:in `run'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:180:in `run!'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/bin/mailcatcher:6:in `<top (required)>'
    from /usr/local/bin/mailcatcher:25:in `load'
    from /usr/local/bin/mailcatcher:25:in `<main>'
<internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require': /lib64/libm.so.6: version `GLIBC_2.29' not found (required by /usr/local/share/gems/gems/sqlite3-1.6.0-aarch64-linux/lib/sqlite3/3.0/sqlite3_native.so) - /usr/local/share/gems/gems/sqlite3-1.6.0-aarch64-linux/lib/sqlite3/3.0/sqlite3_native.so (LoadError)
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/sqlite3-1.6.0-aarch64-linux/lib/sqlite3.rb:4:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher/mail.rb:6:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher/smtp.rb:5:in `<top (required)>'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from <internal:/usr/share/rubygems/rubygems/core_ext/kernel_require.rb>:85:in `require'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:183:in `block (2 levels) in run!'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:233:in `rescue_port'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:182:in `block in run!'
    from /usr/local/share/gems/gems/eventmachine-1.0.9.1/lib/eventmachine.rb:193:in `run_machine'
    from /usr/local/share/gems/gems/eventmachine-1.0.9.1/lib/eventmachine.rb:193:in `run'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/lib/mail_catcher.rb:180:in `run!'
    from /usr/local/share/gems/gems/mailcatcher-0.8.2/bin/mailcatcher:6:in `<top (required)>'
    from /usr/local/bin/mailcatcher:25:in `load'
    from /usr/local/bin/mailcatcher:25:in `<main>'
[root@b05b6af9c21b /]# ruby --version
ruby 3.0.4p208 (2022-04-12 revision 3fa771dded) [aarch64-linux]
[root@b05b6af9c21b /]# mailcatcher --version
MailCatcher v0.8.2
[root@b05b6af9c21b /]# gem list

*** LOCAL GEMS ***

abbrev (default: 0.1.0)
base64 (default: 0.1.0)
benchmark (default: 0.1.1)
bigdecimal (3.0.0)
bundler (2.2.33)
cgi (default: 0.2.1)
csv (default: 3.1.9)
daemons (1.4.1)
date (3.3.3, default: 3.1.3)
dbm (default: 1.1.0)
debug (default: 0.2.1)
delegate (default: 0.2.0)
did_you_mean (default: 1.5.0)
digest (default: 3.0.0)
drb (default: 2.0.5)
english (default: 0.7.1)
erb (default: 2.2.0)
etc (default: 1.3.0)
eventmachine (1.0.9.1)
fcntl (default: 1.0.1)
fiddle (default: 1.0.8)
fileutils (default: 1.5.0)
find (default: 0.1.0)
forwardable (default: 1.3.2)
gdbm (default: 2.1.0)
getoptlong (default: 0.1.1)
io-console (0.5.7)
io-nonblock (default: 0.1.0)
io-wait (default: 0.2.0)
ipaddr (default: 1.2.2)
json (2.5.1)
logger (default: 1.4.3)
mail (2.8.0.1)
mailcatcher (0.8.2)
matrix (default: 0.3.1)
mini_mime (1.1.2)
mutex_m (default: 0.1.1)
net-ftp (default: 0.1.2)
net-http (default: 0.1.1)
net-imap (0.3.4, default: 0.1.1)
net-pop (0.1.2, default: 0.1.1)
net-protocol (0.2.1, default: 0.1.1)
net-smtp (0.3.3, default: 0.2.1)
nkf (default: 0.1.0)
observer (default: 0.1.1)
open-uri (default: 0.1.0)
open3 (default: 0.1.1)
openssl (default: 2.2.1)
optparse (default: 0.1.1)
ostruct (default: 0.3.1)
pathname (default: 0.1.0)
pp (default: 0.2.1)
prettyprint (default: 0.1.1)
prime (default: 0.1.2)
pstore (default: 0.1.1)
psych (3.3.2)
racc (default: 1.5.2)
rack (1.6.13)
rack-protection (1.5.5)
rdoc (6.3.3)
readline (default: 0.0.2)
readline-ext (default: 0.1.1)
reline (default: 0.2.5)
resolv (default: 0.2.1)
resolv-replace (default: 0.1.0)
rinda (default: 0.1.1)
securerandom (default: 0.1.0)
set (default: 1.0.1)
shellwords (default: 0.1.0)
sinatra (1.4.8)
singleton (default: 0.1.1)
skinny (0.2.4)
sqlite3 (1.6.0 aarch64-linux)
stringio (default: 3.0.1)
strscan (default: 3.0.1)
syslog (default: 0.1.0)
tempfile (default: 0.1.1)
thin (1.5.1)
tilt (2.0.11)
time (default: 0.1.0)
timeout (0.3.1, default: 0.1.1)
tmpdir (default: 0.1.2)
tracer (default: 0.1.1)
tsort (default: 0.1.0)
un (default: 0.1.0)
uri (default: 0.10.1)
weakref (default: 0.1.1)
yaml (default: 0.1.1)
zlib (default: 2.0.0)
[root@b05b6af9c21b /]# rpm -qa|grep glibc
glibc-common-2.28-224.el8.aarch64
glibc-2.28-224.el8.aarch64
glibc-headers-2.28-224.el8.aarch64
glibc-devel-2.28-224.el8.aarch64
glibc-langpack-en-2.28-224.el8.aarch64
glibc-gconv-extra-2.28-224.el8.aarch64
glibc-minimal-langpack-2.28-224.el8.aarch64

however on x86 It works with the same version of main libs ...

[root@4396f81f9875 /]# mailcatcher
Starting MailCatcher v0.8.2
==> smtp://127.0.0.1:1025
==> http://127.0.0.1:1080
*** MailCatcher runs as a daemon by default. Go to the web interface to quit.
[root@4396f81f9875 /]# cat /etc/centos-release
CentOS Stream release 8
[root@4396f81f9875 /]# ruby --version
ruby 3.0.4p208 (2022-04-12 revision 3fa771dded) [x86_64-linux]
[root@4396f81f9875 /]# mailcatcher --version
MailCatcher v0.8.2
[root@4396f81f9875 /]# gem list

*** LOCAL GEMS ***

abbrev (default: 0.1.0)
base64 (default: 0.1.0)
benchmark (default: 0.1.1)
bigdecimal (3.0.0)
bundler (2.2.33)
cgi (default: 0.2.1)
csv (default: 3.1.9)
daemons (1.4.1)
date (3.3.3, default: 3.1.3)
dbm (default: 1.1.0)
debug (default: 0.2.1)
delegate (default: 0.2.0)
did_you_mean (default: 1.5.0)
digest (default: 3.0.0)
drb (default: 2.0.5)
english (default: 0.7.1)
erb (default: 2.2.0)
etc (default: 1.3.0)
eventmachine (1.0.9.1)
fcntl (default: 1.0.1)
fiddle (default: 1.0.8)
fileutils (default: 1.5.0)
find (default: 0.1.0)
forwardable (default: 1.3.2)
gdbm (default: 2.1.0)
getoptlong (default: 0.1.1)
io-console (0.5.7)
io-nonblock (default: 0.1.0)
io-wait (default: 0.2.0)
ipaddr (default: 1.2.2)
json (2.5.1)
logger (default: 1.4.3)
mail (2.8.0.1)
mailcatcher (0.8.2)
matrix (default: 0.3.1)
mini_mime (1.1.2)
mutex_m (default: 0.1.1)
net-ftp (default: 0.1.2)
net-http (default: 0.1.1)
net-imap (0.3.4, default: 0.1.1)
net-pop (0.1.2, default: 0.1.1)
net-protocol (0.2.1, default: 0.1.1)
net-smtp (0.3.3, default: 0.2.1)
nkf (default: 0.1.0)
observer (default: 0.1.1)
open-uri (default: 0.1.0)
open3 (default: 0.1.1)
openssl (default: 2.2.1)
optparse (default: 0.1.1)
ostruct (default: 0.3.1)
pathname (default: 0.1.0)
pp (default: 0.2.1)
prettyprint (default: 0.1.1)
prime (default: 0.1.2)
pstore (default: 0.1.1)
psych (3.3.2)
racc (default: 1.5.2)
rack (1.6.13)
rack-protection (1.5.5)
rdoc (6.3.3)
readline (default: 0.0.2)
readline-ext (default: 0.1.1)
reline (default: 0.2.5)
resolv (default: 0.2.1)
resolv-replace (default: 0.1.0)
rinda (default: 0.1.1)
securerandom (default: 0.1.0)
set (default: 1.0.1)
shellwords (default: 0.1.0)
sinatra (1.4.8)
singleton (default: 0.1.1)
skinny (0.2.4)
sqlite3 (1.6.0 x86_64-linux)
stringio (default: 3.0.1)
strscan (default: 3.0.1)
syslog (default: 0.1.0)
tempfile (default: 0.1.1)
thin (1.5.1)
tilt (2.0.11)
time (default: 0.1.0)
timeout (0.3.1, default: 0.1.1)
tmpdir (default: 0.1.2)
tracer (default: 0.1.1)
tsort (default: 0.1.0)
un (default: 0.1.0)
uri (default: 0.10.1)
weakref (default: 0.1.1)
yaml (default: 0.1.1)
zlib (default: 2.0.0)
[root@4396f81f9875 /]# rpm -qa|grep glibc
glibc-common-2.28-224.el8.x86_64
glibc-minimal-langpack-2.28-224.el8.x86_64
glibc-headers-2.28-224.el8.x86_64
glibc-2.28-224.el8.x86_64
glibc-langpack-en-2.28-224.el8.x86_64
glibc-gconv-extra-2.28-224.el8.x86_64
glibc-devel-2.28-224.el8.x86_64

My dockerfile

FROM quay.io/centos/centos:stream8

RUN dnf -y module enable ruby:3.0 && \
    dnf install -y gcc-c++ ruby-devel make && \
    gem install mailcatcher --no-document
dolgovas commented 1 year ago

It works with manual install sqlite3:1.4.4. It seems like sqlite3 prebuild (after 1.5.0) doesn't work on Centos8_aarch

sj26 commented 11 months ago

Sorry! This sounds like it's an issue with upstream and we can't solve that here. Sounds like you've got a workaround, though. 🙏

sj26 commented 11 months ago

Looks like the same thing here:

https://github.com/sparklemotion/sqlite3-ruby/issues/372

Doing one of these before installing mailcatcher seems to work:

gem install sqlite3 --version="~> 1.3" --platform=ruby

and is what I'm doing to build working arm64 docker images:

https://github.com/sj26/mailcatcher/commit/68188f1ffd4ce685bf68d907fa77f5f608ce7c7f

wayne530 commented 8 months ago

@sj26 Manually running this workaround doesn't seem to work for me:

# gem install sqlite3 --version="~> 1.3" --platform=ruby
Fetching mini_portile2-2.8.5.gem
Fetching sqlite3-1.6.8.gem
Successfully installed mini_portile2-2.8.5
Building native extensions. This could take a while...
ERROR:  Error installing sqlite3:
        ERROR: Failed to build gem native extension.

    current directory: /usr/lib/ruby/gems/3.1.0/gems/sqlite3-1.6.8/ext/sqlite3
/usr/bin/ruby -I /usr/lib/ruby/3.1.0 extconf.rb
Building sqlite3-ruby using packaged sqlite3.
*** 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/bin/$(RUBY_BASE_NAME)
        --help
        --download-dependencies
        --with-sqlcipher
        --without-sqlcipher
        --with-sqlcipher-dir
        --without-sqlcipher-dir
        --with-sqlcipher-include
        --without-sqlcipher-include
        --with-sqlcipher-lib
        --without-sqlcipher-lib
        --enable-system-libraries
        --disable-system-libraries
        --with-sqlcipher
        --without-sqlcipher
        --with-sqlcipher-dir
        --without-sqlcipher-dir
        --with-sqlcipher-include
        --without-sqlcipher-include
        --with-sqlcipher-lib
        --without-sqlcipher-lib
        --with-sqlite-source-dir
        --with-sqlite-cflags
        --without-sqlite-cflags
extconf.rb:70:in `join': no implicit conversion of nil into String (TypeError)
        from extconf.rb:70:in `block in configure_packaged_libraries'
        from <internal:kernel>:90:in `tap'
        from extconf.rb:51:in `configure_packaged_libraries'
        from extconf.rb:17:in `configure'
        from extconf.rb:285:in `<main>'

extconf failed, exit code 1

Gem files will remain installed in /usr/lib/ruby/gems/3.1.0/gems/sqlite3-1.6.8 for inspection.
Results logged to /usr/lib/ruby/gems/3.1.0/extensions/aarch64-linux-musl/3.1.0/sqlite3-1.6.8/gem_make.out