2017-05-19 9 views
2

私はRuby on Rails 5.1.0アプリケーションをコンテナ化しようとしていますが、環境からDATABASE_URLを取り上げないといくつか問題があります。Docker Compose:RailsはPostgresに接続するためにDATABASE_URLを尊重しません

$ docker-compose run app rails c 
Running via Spring preloader in process 25 
Loading development environment (Rails 5.1.0) 
irb(main):001:0> ENV['DATABASE_URL'] 
=> "postgres://postgres:[email protected]:5432/myapp_development" 

しかし、私はdocker-compose run app rake db:createを実行した場合、その後、私はできないというエラーが出ます:docker-compose.ymlで、私は次のサービスがあります。私はdocker-compose run app rails cを実行する場合

app: 
    build: . 
    command: bundle exec rails s -p 3000 -b '0.0.0.0' 
    volumes: 
    - .:/myapp 
    environment: 
    DATABASE_URL: postgres://postgres:[email protected]:5432/myapp_development 

を環境がうまく拾いますlocalhostに接続する:

$ docker-compose run app rake db:create 
Database 'myapp_development' already exists 
could not connect to server: Connection refused 
    Is the server running on host "localhost" (::1) and accepting 
    TCP/IP connections on port 5432? 
could not connect to server: Connection refused 
    Is the server running on host "localhost" (127.0.0.1) and accepting 
    TCP/IP connections on port 5432? 
Couldn't create database for {"adapter"=>"postgresql", "host"=>"localhost", "pool"=>10, "timeout"=>5000, "database"=>"myapp_test"} 
rake aborted! 

私はここで間違って何を考えていますか?

編集:ここではdatabase.ymlは次のようになります。問題はrakeタスクである

common: &common 
    adapter: postgresql 
    pool: 10 
    timeout: 5000 

development: 
    <<: *common 
    database: myapp_development 

test: 
    <<: *common 
    database: myapp_test 

production: 
    <<: *common 
    database: myapp_production 
+0

私はあなたに私の解決策を教えてもらえますが、あなたの質問に直接答えないので、コメントに入れます。あなたはpostgresに分離されたコンテナを追加し、postgresコンテナ名と一致するあなたのdatabase.ymlにホスト設定を追加することができます。その後、コンテナにログインすると、エラーなしで任意のコマンドを実行することができます。興味があれば詳細な回答を記入することができます。 –

答えて

0

、テスト・データベースを作成しようとしている、私はあなたのdatabase.ymllocalhostホストとのテスト環境を持っていると仮定します。 rake db:create

の説明から

はDATABASE_URLからデータベースまたは 電流RAILS_ENV(:作成:すべて configにすべてのデータベースを作成するために使用するDB)用のconfig/database.ymlをを作成します。 RAILS_ENVなしそれが発展を作成するためのデフォルトと テスト・データベース

あなたは明らかにENVを渡す必要があるか、それがデフォルトでテスト・データベースを作成することができます。

database.ymlでテストデータベースのクレジットを変更することをお勧めします。

Connection Preference

+0

これは意味がありますが、なぜそれが 'myapp_development' 'myapp_test'を作成しようとすると接続しません。' database.yml'には同じ場所に接続します。私の答えは 'database.yml'を含むように編集します。 –

+0

あなたのコメントはありません。両方の環境でdatabase.ymlを変更し、ホストを_evidently_に設定してください。 –

+0

環境で 'DATABASE_URL'を提供している場合、ホストを設定する必要はありません。 –

1

私は同じ問題を持っていた設定のマージが何らかの形でのRails 5.1.xの

に壊れているように、あなたがあなたのdefaultブロックにurl: <%= ENV['DATABASE_URL'] %>を追加することにより、DATABASE_URLの使用を強制することができそうです。

0

私も同様の問題を抱えていましたが、その原因は複数倍でした。

TL; DRは、ことを確認してください:

  1. あなたappコンテナが正しくpostgresコンテナ
  2. RAILS_ENV ENVの正しいホスト名にし、あなたのpostgresコンテナ
  3. あなたDATABASE_URL参照に依存してリンクされています変数はお客様のappコンテナ内に明示的に設定されています

まず第一に、私はdocker_compose.ymlの私appコンテナがリンクされたことを確認しなければならなかったとpostgresコンテナに依存:

version: '3' 
    services: 
     app: 
     container_name: 'app' 
     depends_on: 
      - postgres 
     links: 
      - postgres 

第二に、私はdatabase.ymlを提供していたDATABASE_URL ENV変数はpostgresのの、正しいホスト名を参照していませんでしたコンテナ。

'postgres://postgres:@postgres:5432/my_app_development'

ない見かけ上のあなたのケースでは問題はなく、他人のために、注目に値する:私はそれを変更し

'postgres://postgres:@localhost:5432/my_app_development'

:もともと、鉱山のように見えました。

第3に、私は明示的にRAILS_ENV環境を指定していませんでした。私は正しいdatabase.yml設定が使用されるようにdevelopmentdocker_compose.ymlにそのENV変数を設定しました。

database.ymlファイルの最終結果:私のdocker_compose.ymlファイルの

development: &default 
    adapter: postgresql 
    encoding: unicode 
    database: my_app_development 
    username: postgres 
    pool: 5 
    timeout: 5000 
    url: <%= ENV['DATABASE_URL'] %> 

test: 
    <<: *default 
    database: my_app_test 
    pool: 5 
    url: <%= ENV['DATABASE_URL'] %> 

production: 
    <<: *default 
    url: <%= ENV['DATABASE_URL'] %> 

最終結果:その後

version: '3' 
services: 
    app: 
    container_name: 'app' 
    environment: 
     DATABASE_URL: 'postgres://postgres:@postgres:5432/my_app_development' 
     RAILS_ENV: 'development' 
    build: . 
    ports: 
     - '3000:3000' 
    volumes: 
     - ./:/dev 
    depends_on: 
     - postgres 
    links: 
     - postgres 
    tty: true 

    postgres: 
    container_name: 'postgres' 
    image: postgres:9.5 
    ports: 
     - '5432:5432' 
    environment: 
     POSTGRES_USER: postgres 
     POSTGRES_PASSWORD: 

、すべてbundle exec rake db:のコマンドがうまく働きました。

希望に役立ちます!

関連する問題