Rails на Docker - Игнорирование GEM, потому что расширения не построены - PullRequest
1 голос
/ 31 марта 2020

Я схожу с ума от этой ошибки в течение последних двух дней. Я пытаюсь 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 сервера.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...