Rails 当 rails 环境在 Passenger inside Docker 上设置为生产环境时尝试连接到本地主机
Rails trying to connect to localhost when rails environment is set to production on Passenger inside Docker
我正在尝试使用 Passenger(5.1.2)、Nginx 和 Docker 部署一个 Rails 应用程序,我已经在没有 Docker 的单个服务器上部署了一个应用程序都成功了。
我遇到的问题是,即使我将 passenger_app_env
设置为生产环境,启动 Nginx 时,Rails 应用程序也会尝试连接到我本地主机上的 PostgreSQL,但是当我访问 rails 控制台时,连接成功。
最奇怪的是,在我的 database.yml
我的开发凭证和我的生产凭证中有一个主机,它不是 localhost
而是 Amazon RDS
development:
database: <%= ENV['POSTGRES_DB_DEV'] %>
adapter: postgresql
encoding: unicode
user: <%= ENV['POSTGRES_USER_DEV'] %>
password: <%= ENV['POSTGRES_PWD_DEV'] %>
host: <%= ENV['POSTGRES_HOST_DEV'] %>
port: <%= ENV['POSTGRES_PORT_DEV'] %>
pool: <%= ENV['POSTGRES_POOL_DEV'] %>
production:
database: <%= ENV['POSTGRES_DB_PROD'] %>
adapter: postgresql
encoding: unicode
user: <%= ENV['POSTGRES_USER_PROD'] %>
password: <%= ENV['POSTGRES_PWD_PROD'] %>
host: <%= ENV['POSTGRES_HOST_PROD'] %>
port: <%= ENV['POSTGRES_PORT_PROD'] %>
pool: <%= ENV['POSTGRES_POOL_PROD'] %>
主机对应的变量是:
xxxxx.xxxx.xx-xxx.rds.amazonaws.com
以下是 Passenger 在启动应用程序时设置的环境变量:
GEM_HOME = /opt/rvm/gems/ruby-2.1.2
SHELL = /usr/sbin/nologin
IRBRC = /opt/rvm/rubies/ruby-2.1.2/.irbrc
PYTHONUNBUFFERED = 1
PASSENGER_DEBUG_DIR = /tmp/passenger.spawn-debug.XXXX7Po96m
MY_RUBY_HOME = /opt/rvm/rubies/ruby-2.1.2
USER = nobody
IN_PASSENGER = 1
RACK_ENV = production
PASSENGER_USE_FEEDBACK_FD = true
PATH = /opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
WSGI_ENV = production
PWD = /api
NODE_PATH = /usr/share/passenger/node
NODE_ENV = production
SHLVL = 0
HOME = /nonexistent
RAILS_ENV = production
LOGNAME = nobody
SERVER_SOFTWARE = nginx/1.10.2 Phusion_Passenger/5.1.2
GEM_PATH = /opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global
PASSENGER_APP_ENV = production
RUBY_VERSION = ruby-2.1.2
BUNDLER_ORIG_PATH = /opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
BUNDLER_ORIG_GEM_PATH = /opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global
BUNDLE_BIN_PATH = /opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/exe/bundle
BUNDLE_GEMFILE = /Befective/api/Gemfile
BUNDLER_VERSION = 1.14.6
RUBYOPT = -rbundler/setup
RUBYLIB = /opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/lib
站点的 Nginx 配置文件:
server {
listen 80 default_server;
listen [::]:80 default_server;
passenger_enabled on;
passenger_app_env production;
passenger_max_request_queue_size 2000;
passenger_ruby /opt/rvm/wrappers/ruby-2.1.2/ruby;
root /api/public;
index index.html index.htm index.nginx-debian.html;
server_name _;
}
乘客提出错误:
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
(PG::ConnectionBad)
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `new'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `connect'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:242:in `initialize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `new'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `postgresql_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_handling.rb:87:in `connection'
/Befective/api/config/initializers/apartment.rb:23:in `block in <top (required)>'
/opt/rvm/gems/ruby-2.1.2/gems/apartment-1.1.0/lib/apartment.rb:24:in `configure'
/Befective/api/config/initializers/apartment.rb:12:in `<top (required)>'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `load'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `block in load'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:240:in `load_dependency'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `load'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:652:in `block in load_config_initializer'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/notifications.rb:166:in `instrument'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:651:in `load_config_initializer'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:615:in `each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:615:in `block in <class:Engine>'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:30:in `instance_exec'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:30:in `run'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:55:in `block in run_initializers'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:418:in `block (2 levels) in each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:417:in `block in each_strongly_connected_component_from'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:44:in `each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:44:in `tsort_each_child'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `call'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `call'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:54:in `run_initializers'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/application.rb:352:in `initialize!'
/Befective/api/config/environment.rb:5:in `<top (required)>'
config.ru:3:in `require'
config.ru:3:in `block in <main>'
/opt/rvm/gems/ruby-2.1.2/gems/rack-1.6.4/lib/rack/builder.rb:55:in `instance_eval'
/opt/rvm/gems/ruby-2.1.2/gems/rack-1.6.4/lib/rack/builder.rb:55:in `initialize'
config.ru:1:in `new'
config.ru:1:in `<main>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:110:in `eval'
/usr/share/passenger/helper-scripts/rack-preloader.rb:110:in `preload_app'
/usr/share/passenger/helper-scripts/rack-preloader.rb:156:in `<module:App>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<main>'
即使我输入 docker 本身并执行 rails 服务器命令,它也会成功执行。
*** 编辑 ****
所以我已经设法知道是什么导致了这个错误,但现在我不知道如何解决这个问题,似乎是在初始化 Rails 应用程序后 Rails.application.initialize!
所有环境变量设置不正确,我确实设置了 DATABASE_URL
环境变量来测试这种行为,并在 environment.rb
中初始化 Rails 应用程序后打印了所有变量,并且缺少环境变量 DATABASE_URL
,文件:
#environment.rb
Rails.application.initialize!
raise "#{ENV.to_h.to_s}"
结果:
Message from application: true {"development"=>{"database"=>nil, "adapter"=>"postgresql", "encoding"=>"unicode", "user"=>nil, "password"=>nil, "host"=>nil, "port"=>nil, "pool"=>nil}, "production"=>{"database"=>nil, "adapter"=>"postgresql", "encoding"=>"unicode", "user"=>nil, "password"=>nil, "host"=>nil, "port"=>nil, "pool"=>nil}}, {"GEM_HOME"=>"/opt/rvm/gems/ruby-2.1.2", "SHELL"=>"/usr/sbin/nologin", "IRBRC"=>"/opt/rvm/rubies/ruby-2.1.2/.irbrc", "PYTHONUNBUFFERED"=>"1", "PASSENGER_DEBUG_DIR"=>"/tmp/passenger.spawn-debug.XXXXS4Y1Ah", "MY_RUBY_HOME"=>"/opt/rvm/rubies/ruby-2.1.2", "USER"=>"www-data", "IN_PASSENGER"=>"1", "RACK_ENV"=>"production", "PASSENGER_USE_FEEDBACK_FD"=>"true", "PATH"=>"/opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.", "WSGI_ENV"=>"production", "PWD"=>"/Befective/api", "NODE_PATH"=>"/usr/share/passenger/node", "NODE_ENV"=>"production", "SHLVL"=>"0", "HOME"=>"/var/www", "RAILS_ENV"=>"production", "LOGNAME"=>"www-data", "SERVER_SOFTWARE"=>"nginx/1.10.2 Phusion_Passenger/5.1.2", "GEM_PATH"=>"/opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global", "PASSENGER_APP_ENV"=>"production", "RUBY_VERSION"=>"ruby-2.1.2", "BUNDLER_ORIG_PATH"=>"/opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.", "BUNDLER_ORIG_GEM_PATH"=>"/opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global", "BUNDLE_BIN_PATH"=>"/opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/exe/bundle", "BUNDLE_GEMFILE"=>"/Befective/api/Gemfile", "BUNDLER_VERSION"=>"1.14.6", "RUBYOPT"=>"-rbundler/setup", "RUBYLIB"=>"/opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/lib"}
因此,在花了几个小时解决这个错误之后,我终于设法克服了它!
By default, nginx removes all environment variables inherited from its
parent process except the TZ variable. This directive allows
preserving some of the inherited variables, changing their values, or
creating new environment variables.
这就是为什么您使用 docker run -e
设置的任何环境变量都不会到达 Nginx。
为了保留这些变量,在/etc/nginx/main.d
目录下放置一个以*.conf
结尾的Nginx配置文件,在里面告诉Nginx保留这些变量,然后在[=13]里面引用这些文件=] 添加 include /etc/nginx/main.d/*.conf;
我正在尝试使用 Passenger(5.1.2)、Nginx 和 Docker 部署一个 Rails 应用程序,我已经在没有 Docker 的单个服务器上部署了一个应用程序都成功了。
我遇到的问题是,即使我将 passenger_app_env
设置为生产环境,启动 Nginx 时,Rails 应用程序也会尝试连接到我本地主机上的 PostgreSQL,但是当我访问 rails 控制台时,连接成功。
最奇怪的是,在我的 database.yml
我的开发凭证和我的生产凭证中有一个主机,它不是 localhost
而是 Amazon RDS
development:
database: <%= ENV['POSTGRES_DB_DEV'] %>
adapter: postgresql
encoding: unicode
user: <%= ENV['POSTGRES_USER_DEV'] %>
password: <%= ENV['POSTGRES_PWD_DEV'] %>
host: <%= ENV['POSTGRES_HOST_DEV'] %>
port: <%= ENV['POSTGRES_PORT_DEV'] %>
pool: <%= ENV['POSTGRES_POOL_DEV'] %>
production:
database: <%= ENV['POSTGRES_DB_PROD'] %>
adapter: postgresql
encoding: unicode
user: <%= ENV['POSTGRES_USER_PROD'] %>
password: <%= ENV['POSTGRES_PWD_PROD'] %>
host: <%= ENV['POSTGRES_HOST_PROD'] %>
port: <%= ENV['POSTGRES_PORT_PROD'] %>
pool: <%= ENV['POSTGRES_POOL_PROD'] %>
主机对应的变量是:
xxxxx.xxxx.xx-xxx.rds.amazonaws.com
以下是 Passenger 在启动应用程序时设置的环境变量:
GEM_HOME = /opt/rvm/gems/ruby-2.1.2
SHELL = /usr/sbin/nologin
IRBRC = /opt/rvm/rubies/ruby-2.1.2/.irbrc
PYTHONUNBUFFERED = 1
PASSENGER_DEBUG_DIR = /tmp/passenger.spawn-debug.XXXX7Po96m
MY_RUBY_HOME = /opt/rvm/rubies/ruby-2.1.2
USER = nobody
IN_PASSENGER = 1
RACK_ENV = production
PASSENGER_USE_FEEDBACK_FD = true
PATH = /opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
WSGI_ENV = production
PWD = /api
NODE_PATH = /usr/share/passenger/node
NODE_ENV = production
SHLVL = 0
HOME = /nonexistent
RAILS_ENV = production
LOGNAME = nobody
SERVER_SOFTWARE = nginx/1.10.2 Phusion_Passenger/5.1.2
GEM_PATH = /opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global
PASSENGER_APP_ENV = production
RUBY_VERSION = ruby-2.1.2
BUNDLER_ORIG_PATH = /opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.
BUNDLER_ORIG_GEM_PATH = /opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global
BUNDLE_BIN_PATH = /opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/exe/bundle
BUNDLE_GEMFILE = /Befective/api/Gemfile
BUNDLER_VERSION = 1.14.6
RUBYOPT = -rbundler/setup
RUBYLIB = /opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/lib
站点的 Nginx 配置文件:
server {
listen 80 default_server;
listen [::]:80 default_server;
passenger_enabled on;
passenger_app_env production;
passenger_max_request_queue_size 2000;
passenger_ruby /opt/rvm/wrappers/ruby-2.1.2/ruby;
root /api/public;
index index.html index.htm index.nginx-debian.html;
server_name _;
}
乘客提出错误:
could not connect to server: No such file or directory
Is the server running locally and accepting
connections on Unix domain socket "/var/run/postgresql/.s.PGSQL.5432"?
(PG::ConnectionBad)
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `initialize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `new'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:651:in `connect'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:242:in `initialize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `new'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/postgresql_adapter.rb:44:in `postgresql_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:438:in `new_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:448:in `checkout_new_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:422:in `acquire_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:349:in `block in checkout'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:348:in `checkout'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:263:in `block in connection'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/monitor.rb:211:in `mon_synchronize'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:262:in `connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_adapters/abstract/connection_pool.rb:571:in `retrieve_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_handling.rb:113:in `retrieve_connection'
/opt/rvm/gems/ruby-2.1.2/gems/activerecord-4.2.7/lib/active_record/connection_handling.rb:87:in `connection'
/Befective/api/config/initializers/apartment.rb:23:in `block in <top (required)>'
/opt/rvm/gems/ruby-2.1.2/gems/apartment-1.1.0/lib/apartment.rb:24:in `configure'
/Befective/api/config/initializers/apartment.rb:12:in `<top (required)>'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `load'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `block in load'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:240:in `load_dependency'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/dependencies.rb:268:in `load'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:652:in `block in load_config_initializer'
/opt/rvm/gems/ruby-2.1.2/gems/activesupport-4.2.7/lib/active_support/notifications.rb:166:in `instrument'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:651:in `load_config_initializer'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:616:in `block (2 levels) in <class:Engine>'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:615:in `each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/engine.rb:615:in `block in <class:Engine>'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:30:in `instance_exec'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:30:in `run'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:55:in `block in run_initializers'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:226:in `block in tsort_each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:348:in `block (2 levels) in each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:418:in `block (2 levels) in each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:427:in `each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:417:in `block in each_strongly_connected_component_from'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:44:in `each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:44:in `tsort_each_child'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `call'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:411:in `each_strongly_connected_component_from'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:347:in `block in each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `call'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:345:in `each_strongly_connected_component'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:224:in `tsort_each'
/opt/rvm/rubies/ruby-2.1.2/lib/ruby/2.1.0/tsort.rb:205:in `tsort_each'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/initializable.rb:54:in `run_initializers'
/opt/rvm/gems/ruby-2.1.2/gems/railties-4.2.7/lib/rails/application.rb:352:in `initialize!'
/Befective/api/config/environment.rb:5:in `<top (required)>'
config.ru:3:in `require'
config.ru:3:in `block in <main>'
/opt/rvm/gems/ruby-2.1.2/gems/rack-1.6.4/lib/rack/builder.rb:55:in `instance_eval'
/opt/rvm/gems/ruby-2.1.2/gems/rack-1.6.4/lib/rack/builder.rb:55:in `initialize'
config.ru:1:in `new'
config.ru:1:in `<main>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:110:in `eval'
/usr/share/passenger/helper-scripts/rack-preloader.rb:110:in `preload_app'
/usr/share/passenger/helper-scripts/rack-preloader.rb:156:in `<module:App>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:30:in `<module:PhusionPassenger>'
/usr/share/passenger/helper-scripts/rack-preloader.rb:29:in `<main>'
即使我输入 docker 本身并执行 rails 服务器命令,它也会成功执行。
*** 编辑 ****
所以我已经设法知道是什么导致了这个错误,但现在我不知道如何解决这个问题,似乎是在初始化 Rails 应用程序后 Rails.application.initialize!
所有环境变量设置不正确,我确实设置了 DATABASE_URL
环境变量来测试这种行为,并在 environment.rb
中初始化 Rails 应用程序后打印了所有变量,并且缺少环境变量 DATABASE_URL
,文件:
#environment.rb
Rails.application.initialize!
raise "#{ENV.to_h.to_s}"
结果:
Message from application: true {"development"=>{"database"=>nil, "adapter"=>"postgresql", "encoding"=>"unicode", "user"=>nil, "password"=>nil, "host"=>nil, "port"=>nil, "pool"=>nil}, "production"=>{"database"=>nil, "adapter"=>"postgresql", "encoding"=>"unicode", "user"=>nil, "password"=>nil, "host"=>nil, "port"=>nil, "pool"=>nil}}, {"GEM_HOME"=>"/opt/rvm/gems/ruby-2.1.2", "SHELL"=>"/usr/sbin/nologin", "IRBRC"=>"/opt/rvm/rubies/ruby-2.1.2/.irbrc", "PYTHONUNBUFFERED"=>"1", "PASSENGER_DEBUG_DIR"=>"/tmp/passenger.spawn-debug.XXXXS4Y1Ah", "MY_RUBY_HOME"=>"/opt/rvm/rubies/ruby-2.1.2", "USER"=>"www-data", "IN_PASSENGER"=>"1", "RACK_ENV"=>"production", "PASSENGER_USE_FEEDBACK_FD"=>"true", "PATH"=>"/opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.", "WSGI_ENV"=>"production", "PWD"=>"/Befective/api", "NODE_PATH"=>"/usr/share/passenger/node", "NODE_ENV"=>"production", "SHLVL"=>"0", "HOME"=>"/var/www", "RAILS_ENV"=>"production", "LOGNAME"=>"www-data", "SERVER_SOFTWARE"=>"nginx/1.10.2 Phusion_Passenger/5.1.2", "GEM_PATH"=>"/opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global", "PASSENGER_APP_ENV"=>"production", "RUBY_VERSION"=>"ruby-2.1.2", "BUNDLER_ORIG_PATH"=>"/opt/rvm/gems/ruby-2.1.2/bin:/opt/rvm/gems/ruby-2.1.2@global/bin:/opt/rvm/rubies/ruby-2.1.2/bin:/usr/local/bin:/usr/local/sbin:/usr/bin:/usr/sbin:/bin:/sbin:.", "BUNDLER_ORIG_GEM_PATH"=>"/opt/rvm/gems/ruby-2.1.2:/opt/rvm/gems/ruby-2.1.2@global", "BUNDLE_BIN_PATH"=>"/opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/exe/bundle", "BUNDLE_GEMFILE"=>"/Befective/api/Gemfile", "BUNDLER_VERSION"=>"1.14.6", "RUBYOPT"=>"-rbundler/setup", "RUBYLIB"=>"/opt/rvm/gems/ruby-2.1.2/gems/bundler-1.14.6/lib"}
因此,在花了几个小时解决这个错误之后,我终于设法克服了它!
By default, nginx removes all environment variables inherited from its parent process except the TZ variable. This directive allows preserving some of the inherited variables, changing their values, or creating new environment variables.
这就是为什么您使用 docker run -e
设置的任何环境变量都不会到达 Nginx。
为了保留这些变量,在/etc/nginx/main.d
目录下放置一个以*.conf
结尾的Nginx配置文件,在里面告诉Nginx保留这些变量,然后在[=13]里面引用这些文件=] 添加 include /etc/nginx/main.d/*.conf;