首页 > 解决方案 > 如何在已经开发的 docker 中设置 rails 应用程序

问题描述

我是使用 docker 的新手,我似乎无法正确构建和制作应用程序。我确信它有一些简单的数据库设置或 PG gem 配置。

这是尝试后的输出

=> 启动 Puma
=> Rails 4.2.10 应用程序开始在http://0.0.0.0:3000
上开发 => 运行rails server -h以获得更多启动选项
=> Ctrl-C 关闭服务器

退出

/usr/local/bundle/gems/activerecord-4.2.10/lib/active_record/connection_adapters/connection
_specification.rb:177:in `rescue in spec': Specified 'postgresql' for database adapter, but
 the gem is not loaded. Add `gem 'pg'` to your Gemfile (and ensure its version is at the mi
nimum required by ActiveRecord). (Gem::LoadError)
        from /usr/local/bundle/gems/activerecord-4.2.10/lib/active_record/connection_adapte
rs/connection_specification.
rb:174:in `spec'
        from /usr/local/bundle/gems/activerecord-4.2.10/lib/active_record/connection_handli
ng.
rb:50:in `establish_connection'
        from /usr/local/bundle/gems/activerecord-4.2.10/lib/active_record/railtie.rb:122:in
 `block (2 levels) in <class:Railtie>'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/lazy_load_hooks
.rb:38:in `instance_eval'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/lazy_load_hooks
.rb:38:in `execute_hook'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/lazy_load_hooks
.rb:28:in `block in on_load'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/lazy_load_hooks
.rb:27:in `each'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/lazy_load_hooks
.rb:27:in `on_load'
        from /usr/local/bundle/gems/activerecord-4.2.10/lib/active_record/railtie.
rb:118:in
 `block in <class:Railtie>'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/initializable.rb:30:in `insta
nce_exec'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/initializable.rb:30:in `run'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/initializable.rb:55:in `block
 in run_initializers'
        from /usr/local/lib/ruby/2.4.0/tsort.

rb:228:in `block in tsort_each'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:350:in `block (2 levels) in each_strongly_connected_component'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:431:in `each_strongly_connected_component_from'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:349:in `block in each_strongly_connected_component'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:347:in `each'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:347:in `call'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:347:in `each_strongly_connected_component'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:226:in `tsort_each'
        from /usr/local/lib/ruby/2.4.0/tsort.
rb:205:in `tsort_each'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/initializable.
rb:54:in `run_initializers'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/application.
rb:352:in `initia
lize!'
        from /app/config/environment.rb:7:in `<top (required)>'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/dependencies.
rb:274:in `require'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/dependencies.
rb:274:in `block in require'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/dependencies.
rb:240:in `load_dependency'
        from /usr/local/bundle/gems/activesupport-4.2.10/lib/active_support/dependencies.rb
:274:in `require'
        from /app/config.ru:3:in `block in <main>'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/builder.rb:55:in `instance_eval'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/builder.rb:55:in `initialize'
        from /app/config.ru:in `new'
        from /app/config.ru:in `<main>'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/builder.
rb:49:in `eval'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/builder.
rb:49:in `new_from_string'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/builder.
rb:40:in `parse_file'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/server.
rb:300:in `build_app_and_op
tions_from_config'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/server.
rb:209:in `app'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/server.
rb:61:in `app
'
        from /usr/local/bundle/gems/rack-1.6.12/lib/rack/server.rb:337:in `wrapped_app'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/server.
rb:139:in `lo
g_to_stdout'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/server.
rb:78:in `start'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/commands_tasks.
rb:80
:in `block in server'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/commands_tasks.
rb:75:in `tap'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/commands_tasks.
rb:75
:in `server'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands/commands_tasks.
rb:39
:in `run_command!'
        from /usr/local/bundle/gems/railties-4.2.10/lib/rails/commands.
rb:17:in `<top (requ
ired)>'
        from bin/rails:4:in `require'
        from bin/rails:4:in `<main>'

Dockerfile

FROM ruby:2.4.2-alpine

# Open port 3000 to access the Rails applications
# This does not belong in production as a reverse proxy should route to the application internally
EXPOSE 3000

# Starting command line arguments wrapped in `bundle exec`
ENTRYPOINT ["bundle", "exec"]

# Required pager to using irb or rails console within container
ENV PAGER="busybox less"

# Start Rails server by default bound to 0.0.0.0:3000 of the container
CMD ["rails", "server", "-p", "3000", "-b", "0.0.0.0"]

# Create main application directory
RUN mkdir /app

# Copy all contents of the current directory to the main application directory
COPY . /app

# Set the working directory to the main application directory
WORKDIR /app

# Install required system libraries, latest version of bundle and fetch all dependencies
RUN rm -f /app/tmp/pids/server.pid \
  && apk add --no-cache --verbose \
  bash \
  build-base \
  ca-certificates \
  gcc \
  git \
  libffi-dev \
  libxml2 \
  libxml2-dev \
  libxslt \
  libxslt-dev \
  nodejs \
  patch \
  postgresql-dev \
  ruby \
  ruby-dev \
  tzdata \
  && gem install bundler --pre \
  && gem install tzinfo:1.2.2 tzinfo-data \
  && gem install nokogiri --version 1.8.1 -- --use-system-libraries --with-xml2-config=/usr/local/bin/xml2-config --with-xslt-config=/usr/local/bin/xslt-config \
  && bundle install

# Once the container is built, run it using the following:
# > docker run --detach <image-name-or-hash>
# This will run the container and start Rails as follows from the application directory:
# > bundle exec rails server -p 3000 -b 0.0.0.0

# If you want to run something different like the Rails console:
# > docker run --interactive -tty <image-name-or-hash> rails console
# This will run the conatiner and start the Rails console as follows from the application directory:
# > bundle exec rails console

标签: ruby-on-railsruby

解决方案


该错误表明您在文件中pg定义了数据库适配器时缺少 gem 。postgresqlconfig/database.yml

问题标题说“已经开发”,所以我猜你的 Gemfile 有gem 'pg'一行,你的Gemfile.lock还有一行是指要安装的版本……但你能检查一下吗?:)

然后你没有分享你的Dockerfile所以很难猜出你的问题是什么,但我bundle install敢打赌Dockerfile.

一定要在你的Dockerfile:

RUN bundle install

如果这没有帮助,请使用您的Dockerfile.


推荐阅读