ruby-on-rails - 在 Docker 容器中加载共享库 libsqlite3.so.0 时出错
问题描述
当我尝试从 Alpine Ruby 2.6.3 在 Docker 容器中构建 Rails 应用程序时,我得到以下堆栈跟踪。
我已经尝试安装sqlite
、sqlite-dev
和sqlite-libs
,因为“libsqlite3”没有apk
包。
我会以错误的方式解决这个问题吗?
LoadError: Error loading shared library libsqlite3.so.0: No such file or directory (needed by /usr/local/bundle/gems/sqlite3-1.3.13/lib/sqlite3/sqlite3_native.so) - /usr/local/bundle/gems/sqlite3-1.3.13/lib/sqlite3/sqlite3_native.so
/usr/local/bundle/gems/activesupport-5.0.7/lib/active_support/dependencies.rb:293:in `require'
/usr/local/bundle/gems/activesupport-5.0.7/lib/active_support/dependencies.rb:293:in `block in require'
/usr/local/bundle/gems/activesupport-5.0.7/lib/active_support/dependencies.rb:259:in `load_dependency'
/usr/local/bundle/gems/activesupport-5.0.7/lib/active_support/dependencies.rb:293:in `require'
/usr/local/bundle/gems/sqlite3-1.3.13/lib/sqlite3.rb:6:in `rescue in <top (required)>'
/usr/local/bundle/gems/sqlite3-1.3.13/lib/sqlite3.rb:2:in `<top (required)>'
/app/config/application.rb:7:in `<top (required)>'
这是我的 Dockerfile:
FROM ruby:2.6.4-alpine3.9
WORKDIR /app
ENV RAILS_ENV=production
ENV RAILS_SERVE_STATIC_FILES=true
EXPOSE 3000
####
# Setup ruby environment
####
COPY ./admin/Gemfile* ./admin/*.gemspec ./admin/
COPY ./admin/lib/admin/version.rb ./admin/lib/admin/
RUN apk add --no-cache --virtual=.build-deps \
git openssh-client build-base mariadb-dev sqlite-libs sqlite-dev sqlite \
#Installing bundler without versioning could break things.
&& gem install bundler --pre \
&& bundle install --without=development,test \
&& bundle config \
&& apk del .build-deps
COPY . ./
RUN bundle config && bundle \
&& rm -f config/database.yml \
&& DATABASE_URL=sqlite3:/tmp/assets_dummy.sqlite3 bundle exec rake assets:precompile
COPY entrypoint /usr/local/bin/entrypoint
解决方案
.so
为了运行程序,系统上需要存在动态库或共享对象(以 结尾的文件)。您的长RUN
命令是sqlite-libs
在该阶段安装和使用它bundle install
,然后再次删除它;sqlite
gem 需要仍然安装动态库。
我会在单独的RUN
命令中安装它。由于开发包可能依赖于运行时库,我会先安装它以减少流失和下载时间(略微)。
RUN apk add --no-cache sqlite-libs
RUN apk add --no-cache --virtual=.build-deps \
git openssh-client build-base mariadb-dev sqlite-dev \
... \
&& apk del .build-deps
推荐阅读
- papaja - 摆脱数字下的数字标题
- java - 有没有办法删除 FCM 发送的推送通知数据消息?
- c++ - 无法找到向量的最小时间值
- javascript - 打字稿输出“=!;” 对于未定义/可为空的属性
- java - Akka 和 Android java.lang.VerifyError: Verifier denied class akka.actor
- ajax - Ajax 调用触发控制器功能
- kotlin - Kotlin 的逻辑“和”不会短路?
- swift - 如何获得视频自然分辨率 swift 3?
- bash - 如何在列工具提供的标题输出下方添加一行?
- python - TypeError:“NoneType”对象不可下标引用拆分函数