車輪の再発明でもいいじゃない

フリーランスエンジニアがいろいろ試したりすること

alpine linux + Rails(Puma) 起動エラーで悩みまくった話

前書き

世間ではコンテナ技術が一般的になりますが、任せちゃうがゆえに低レイヤーの知識がなくても使えてしまいますね。

そしてコンテナを作ろうとした際にはまる。私もそんな一人です。対応としては動かしてみてエラーをつぶすしかないでしょうね。

いろいろはまり、検索してもあまりヒットしなかったので忘備録として残します。

まとめとしては、 alpine の パッケージ検索して、alpine のバージョンを確認しようでした

発生した問題

  • ベースイメージ: ruby:2.4.4-alpine3.6
  • 起動コマンド(docker-comporse): bundle exec rails s -b 0.0.0.0 -p 3000

上記の時、以下のエラーが出ました。

api_1         | Exiting
api_1         | /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require': Error loading shared library libssl.so.1.1: No such file or directory (needed by /usr/local/bundle/gems/puma-3.12.0/lib/puma/puma_http11.so) - /usr/local/bundle/gems/puma-3.12.0/lib/puma/puma_http11.so (LoadError)
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/server.rb:15:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/runner.rb:1:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/cluster.rb:1:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/puma/launcher.rb:4:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `block in require'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:257:in `load_dependency'
api_1         |         from /usr/local/bundle/gems/activesupport-5.2.2.1/lib/active_support/dependencies.rb:291:in `require'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/rack/handler/puma.rb:15:in `config'
api_1         |         from /usr/local/bundle/gems/puma-3.12.0/lib/rack/handler/puma.rb:62:in `run'
api_1         |         from /usr/local/bundle/gems/rack-2.0.6/lib/rack/server.rb:297:in `start'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:53:in `start'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:147:in `block in perform'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:142:in `tap'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands/server/server_command.rb:142:in `perform'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor/command.rb:27:in `run'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor/invocation.rb:126:in `invoke_command'
api_1         |         from /usr/local/bundle/gems/thor-0.20.3/lib/thor.rb:387:in `dispatch'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/command/base.rb:65:in `perform'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/command.rb:46:in `invoke'
api_1         |         from /usr/local/bundle/gems/railties-5.2.2.1/lib/rails/commands.rb:18:in `<top (required)>'
api_1         |         from /app/user/bin/rails:9:in `require'
api_1         |         from /app/user/bin/rails:9:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `load'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/rails.rb:28:in `call'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client/command.rb:7:in `call'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/client.rb:30:in `run'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/bin/spring:49:in `<top (required)>'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `load'
api_1         |         from /usr/local/bundle/gems/spring-2.0.2/lib/spring/binstub.rb:31:in `<top (required)>'
api_1         |         from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:70:in `require'
api_1         |         from /usr/local/lib/ruby/site_ruby/2.4.0/rubygems/core_ext/kernel_require.rb:70:in `require'
api_1         |         from /app/user/bin/spring:15:in `<top (required)>'
api_1         |         from /app/user/bin/rails:3:in `load'
api_1         |         from /app/user/bin/rails:3:in `<main>'

TRY & ERROR

  1. openssl-dev を入れてみよう
    • ssl 系なので行けると思ったのですが、コンフリクト[1]が発生して build が失敗
  2. libressl-dev を入れてみよう
    • 1 で記載されているが、alpine では openssl は使われていないらしい、エラーが変わらず
  3. エラーに従って libssl1.1 を入れてみよう
    • build で失敗。 libssl1.0 は入れれたけどエラーは変わらない

最終的な解決方法

パッケージ調べたら alpine 3.9[2] 以降でないとダメそうでした。

仕方がないので、公開されている記事[3]を参考に独自にRuby を入れることにしました。