Я схожу с ума от этой ошибки в течение последних двух дней. Я пытаюсь Dockerize приложения Rails 6
Согласно this Я делаю Dockerfile в два этапа, чтобы минимизировать размер получающегося изображения. Кажется, все работает, как ожидалось: я bundle install
и yarn install
на этапе сборки, а затем скопировать его на заключительный этап. Однако при попытке запустить сервер (через bundle exec rails s
) я получаю следующую ошибку:
Could not find nokogiri-1.10.9 in any of the sources
При запуске bash в соответствующем контейнере мы можем проверить bundle
на наличие драгоценных камней, которые это знает о. Однако bundle list
завершается с ошибкой выше. Просто запуск bundle
дает нам подсказку:
Ignoring bcrypt-3.1.13 because its extensions are not built. Try: gem pristine bcrypt --version 3.1.13
Ignoring bootsnap-1.4.6 because its extensions are not built. Try: gem pristine bootsnap --version 1.4.6
Ignoring ffi-1.12.2 because its extensions are not built. Try: gem pristine ffi --version 1.12.2
Ignoring msgpack-1.3.3 because its extensions are not built. Try: gem pristine msgpack --version 1.3.3
Ignoring nio4r-2.5.2 because its extensions are not built. Try: gem pristine nio4r --version 2.5.2
Ignoring nokogiri-1.10.9 because its extensions are not built. Try: gem pristine nokogiri --version 1.10.9
Ignoring pg-1.2.3 because its extensions are not built. Try: gem pristine pg --version 1.2.3
Ignoring puma-4.3.3 because its extensions are not built. Try: gem pristine puma --version 4.3.3
Ignoring sassc-2.2.1 because its extensions are not built. Try: gem pristine sassc --version 2.2.1
Ignoring websocket-driver-0.7.1 because its extensions are not built. Try: gem pristine websocket-driver --version 0.7.1
На этапе сборки bundle install
был запущен с параметром deployment
, установленным в значение true, что означает, что все драгоценные камни были установлены в местный vendor/bundle
. В самом деле, мы можем видеть, что nokogiri
и остальные недостающие самоцветы вместе с их встроенными расширениями фактически находятся в этой папке:
/usr/src/app> ls -R vendor/bundle/ruby/2.6.0/extensions/x86_64-linux-musl/2.6.0/
# ...
vendor/bundle/ruby/2.6.0/extensions/x86_64-linux-musl/2.6.0/nokogiri-1.10.9:
gem.build_complete gem_make.out mkmf.log nokogiri
vendor/bundle/ruby/2.6.0/extensions/x86_64-linux-musl/2.6.0/nokogiri-1.10.9/nokogiri:
nokogiri.so
# ...
Конечно, проблема может быть исправлена в конечном образе установив соответствующие зависимости сборки и затем запустив bundle install
. Перед этим мы можем увидеть, где находятся скомпилированные библиотеки nokogiri
, которые bundle
не может найти:
/usr/src/app > find / -name nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/extensions/x86_64-linux-musl/2.6.0/nokogiri-1.10.9/nokogiri/nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.9/ext/nokogiri/nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.9/lib/nokogiri/nokogiri.so
После запуска bundle install
, bundle
может найти nokogiri
просто хорошо. Но где это?
/usr/src/app > find / -name nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/extensions/x86_64-linux-musl/2.6.0/nokogiri-1.10.9/nokogiri/nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/extensions/x86_64-linux/2.6.0/nokogiri-1.10.9/nokogiri/nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.9/ext/nokogiri/nokogiri.so
/usr/src/app/vendor/bundle/ruby/2.6.0/gems/nokogiri-1.10.9/lib/nokogiri/nokogiri.so
Ага! Итак, на этапе сборки нам нужно собрать платформу x86_64-linux
вместо платформы x86_64-linux-musl
, что бы это ни было. Вопрос: как нам это сделать?
bundle config set specific_platform x86_64-linux
Я уже пытался установить выше во время сборки, и это не работает. Есть идеи?
Этот пост достаточно длинный: вот ссылка на мой Dockerfile . Если вы хотите попробовать это самостоятельно, обязательно используйте docker-compose up
для запуска необходимого psql сервера.