Skip to content

Instantly share code, notes, and snippets.

@osamu
Last active July 18, 2020 14:35
Show Gist options
  • Save osamu/3ea0a7c41175fb4154e23b4bf80191a1 to your computer and use it in GitHub Desktop.
Save osamu/3ea0a7c41175fb4154e23b4bf80191a1 to your computer and use it in GitHub Desktop.
rbnaclのΧ
古いrails(4.2)のアプリケーションをDocker化したところ、rails sするとffi_libでsodiumが見つからないというエラー
bundle exec ruby -e "require 'rbnacl'"
Traceback (most recent call last):
12: from -e:1:in `<main>'
11: from -e:1:in `require'
10: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl.rb:6:in `<top (required)>'
9: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl.rb:6:in `require'
8: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium/version.rb:6:in `<top (required)>'
7: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium/version.rb:7:in `<module:RbNaCl>'
6: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium/version.rb:9:in `<module:Sodium>'
5: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium/version.rb:13:in `<module:Version>'
4: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium/version.rb:13:in `extend'
3: from /usr/local/bundle/gems/rbnacl-4.0.2/lib/rbnacl/sodium.rb:14:in `extended'
2: from /usr/local/bundle/gems/ffi-1.9.18/lib/ffi/library.rb:100:in `ffi_lib'
1: from /usr/local/bundle/gems/ffi-1.9.18/lib/ffi/library.rb:100:in `map'
/usr/local/bundle/gems/ffi-1.9.18/lib/ffi/library.rb:147:in `block in ffi_lib': Could not open library 'sodium': sodium: cannot open shared object file: No such file or directory. (LoadError)
Could not open library 'libsodium.so': libsodium.so: cannot open shared object file: No such file or directory
root@8f64bd7077ce:/myapp# gem info rbnacl
*** LOCAL GEMS ***
rbnacl (4.0.2)
Authors: Tony Arcieri, Jonathan Stott
Homepage: https://github.com/cryptosphere/rbnacl
License: MIT
Installed at: /usr/local/bundle
Ruby binding to the Networking and Cryptography (NaCl) library
root@8f64bd7077ce:/myapp# gem list rbnacl-libsodium
*** LOCAL GEMS ***
rbnacl-libsodium (1.0.11)
root@8f64bd7077ce:/myapp# gem info rbnacl-libsodium
*** LOCAL GEMS ***
rbnacl-libsodium (1.0.11)
Authors: Artiom Di, Tony Arcieri
Homepage: https://github.com/cryptosphere/rbnacl-libsodium
License: MIT
Installed at: /usr/local/bundle
rbnacl with bundled libsodium
FFI::DynamicLibrary.open(libname, lib_flags)
DEBUG1: DynamicLibary.open sodium, 1
DEBUG1: Exception Could not open library 'sodium': sodium: cannot open shared object file: No such file or directory
DEBUG1: DynamicLibary.open libsodium.so, 1
DEBUG1: Exception Could not open library 'libsodium.so': libsodium.so: cannot open shared object file: No such file or directory
Full path: /usr/local/bundle/gems/rbnacl-libsodium-1.0.11/vendor/libsodium/dist/lib/libsodium.so
これを指定すると動く
```
# encoding: binary
# frozen_string_literal: true
module RbNaCl
# Defines the libsodium init function
module Init
extend FFI::Library
if defined?(RBNACL_LIBSODIUM_GEM_LIB_PATH)
ffi_lib RBNACL_LIBSODIUM_GEM_LIB_PATH
else
ffi_lib '/usr/local/bundle/gems/rbnacl-libsodium-1.0.11/vendor/libsodium/dist/lib/libsodium.so'
end
attach_function :sodium_init, [], :int
end
end
```
RBNACL_LIBSODIUM_GEM_LIB_PATH これが指定されてないことが問題っぽい
/usr/local/bundle/gems/rbnacl-libsodium-1.0.11/lib/rbnacl/libsodium.rb
```
::RBNACL_LIBSODIUM_GEM_LIB_PATH = Dir.glob(File.join(sodiumlib_dir, sodiumlib_glob)).first
```
bundle exec ruby -e "require 'rbnacl/libsodium'"
これだとエラーでない!
bundlerがGemfileにのってるrbnaclを先にrequireしていることが問題!
```
gem 'rbnacl', '>= 3.2.0'
gem 'rbnacl-libsodium'
```
```
gem 'rbnacl-libsodium'
```
しちゃう
attach_function :sodium_init, [], :int
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment