dockerize Rails应用程序,错误Postgres

我正在尝试dockerize一个Rails应用程序。 我得到的问题是,我得到这个错误:

PG::ConnectionBad: 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"? 

容纳Postgres的Docker容器(运行btw):

 3e11664277b3 postgres:9.6.1 "/docker-entrypoint.s" 2 days ago Up 33 minutes 0.0.0.0:15432->5432/tcp mystore_prod_db_1 

包含以下数据库:

  Name | Owner | Encoding | Collate | Ctype | Access privileges -------------------+----------+----------+------------+------------+----------------------- myshop_prod_db | shopradu | UTF8 | en_US.utf8 | en_US.utf8 | myshop_production | shopradu | UTF8 | en_US.utf8 | en_US.utf8 | postgres | postgres | UTF8 | en_US.utf8 | en_US.utf8 | shopradu | postgres | UTF8 | en_US.utf8 | en_US.utf8 | template0 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres template1 | postgres | UTF8 | en_US.utf8 | en_US.utf8 | =c/postgres + | | | | | postgres=CTc/postgres (6 rows) 

我可以使用以下命令与用户shopradu手动连接:

 psql -d myshop_production -U shopradu 

我的.env.prod文件:

 POSTGRES_USER=shopradu POSTGRES_PASSWORD=somePassword POSTGRES_HOST=prod_db RAILS_ENV=production RAILS_SERVE_STATIC_FILES=true SECRET_KEY_BASE=someKeyBase 

database.yml:

 default: &default adapter: postgresql encoding: unicode host: db username: <%= ENV["POSTGRES_USER"] %> password: <%= ENV["POSTGRES_PASSWORD"] %> development: <<: *default host: localhost username: radu password: devPassword database: mystore_dev # Warning: The database defined as "test" will be erased and # re-generated from your development database when you run "rake". # Do not set this db to the same as development or production. test: <<: *default database: db/test.sqlite3 production: <<: *default host: <%= ENV["POSTGRES_HOST"] %> database: myshop_production 

docker-compose.prod.yml文件:

 version: "2" volumes: assets: external: false configs: external: false db-data: external: false services: webserver: image: "nginx:1.11.8" env_file: .env.prod ports: - "80:80" - "443:443" volumes: - assets:/usr/share/nginx/html - configs:/etc/nginx/conf.d prod_db: image: postgres:9.6.1 ports: - "15432:5432" env_file: .env.prod volumes: - db-data:/var/lib/postgresql/data prod_app: build: context: . dockerfile: Dockerfile.prod env_file: .env.prod ports: - "3000:3000" volumes: - assets:/usr/share/nginx/html - configs:/etc/nginx/conf.d depends_on: - prod_db - webserver 

Docker文件:

 FROM ruby:2.2.5 RUN apt-get update -yqq \ && apt-get install -yqq --no-install-recommends \ postgresql-client \ nodejs \ && apt-get -q clean # Pre-install gems with native extensions RUN gem install nokogiri -v "1.6.8.1" WORKDIR /usr/src/app COPY Gemfile* ./ RUN bundle install COPY . . # Pre-compile assets ENV RAILS_ENV production RUN rake assets:precompile CMD script/start 

Production.rb文件:

 Rails.application.configure do # Settings specified here will take precedence over those in config/application.rb. # Code is not reloaded between requests. config.cache_classes = true config.serve_static_files = true config.assets.compile = true config.assets.digest = true config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # Eager load code on boot. This eager loads most of Rails and # your application in memory, allowing both threaded web servers # and those relying on copy on write to perform better. # Rake tasks automatically ignore this option for performance. config.eager_load = true # Full error reports are disabled and caching is turned on. config.consider_all_requests_local = false config.action_controller.perform_caching = true # Enable Rack::Cache to put a simple HTTP cache in front of your application # Add `rack-cache` to your Gemfile before enabling this. # For large-scale production use, consider using a caching reverse proxy like # NGINX, varnish or squid. # config.action_dispatch.rack_cache = true # Disable Rails's static asset server (Apache or NGINX will already do this). config.serve_static_assets = false # Compress JavaScripts and CSS. config.assets.js_compressor = :uglifier # config.assets.css_compressor = :sass # Do not fallback to assets pipeline if a precompiled asset is missed. config.assets.compile = false # Asset digests allow you to set far-future HTTP expiration dates on all assets, # yet still be able to expire them through the digest params. config.assets.digest = true # `config.assets.precompile` and `config.assets.version` have moved to config/initializers/assets.rb # Specifies the header that your server uses for sending files. # config.action_dispatch.x_sendfile_header = 'X-Sendfile' # for Apache # config.action_dispatch.x_sendfile_header = 'X-Accel-Redirect' # for NGINX # Force all access to the app over SSL, use Strict-Transport-Security, and use secure cookies. config.force_ssl = !!ENV["RAILS_FORCE_SSL"].presence # Decrease the log volume. # config.log_level = :info # Prepend all log lines with the following tags. # config.log_tags = [ :subdomain, :uuid ] # Use a different logger for distributed setups. # config.logger = ActiveSupport::TaggedLogging.new(SyslogLogger.new) # Use a different cache store in production. # config.cache_store = :mem_cache_store # Enable serving of images, stylesheets, and JavaScripts from an asset server. # config.action_controller.asset_host = 'http://assets.example.com' # Ignore bad email addresses and do not raise email delivery errors. # Set this to true and configure the email server for immediate delivery to raise delivery errors. # config.action_mailer.raise_delivery_errors = false # Enable locale fallbacks for I18n (makes lookups for any locale fall back to # the I18n.default_locale when a translation cannot be found). config.i18n.fallbacks = true # Send deprecation notices to registered listeners. config.active_support.deprecation = :notify # Use default logging formatter so that PID and timestamp are not suppressed. config.log_formatter = ::Logger::Formatter.new # Do not dump schema after migrations. config.active_record.dump_schema_after_migration = false end 

什么可以在这里错了? 谢谢!

docker-compose.yml ,需要在prod_appprod_db之间添加一个链接。 不包括当前的configuration,这是缺less的:

 prod_app: links: - prod_db 

这样做是将prod_db添加到prod_app映像中的/etc/hosts ,这意味着您使用prod_db作为POSTGRES_HOST的值。

顺便说一句,你不需要改变database.yml的端口。 docker-compose.ymlports指令将主机上的端口映射到容器上的端口。 语法是HOST:CONTAINER ,意思是15672:5672将主机(即您的机器)上的端口15672映射到容器上的端口5672。 只有当你想连接到主机的容器时才有必要。 容器不需要这个端口映射来互相通信。 只要链接两个容器,他们就可以在彼此的所有端口上进行通信。